12

私には3つのプロジェクトがあります。1つはWCFサービスプロジェクト、1つはWPFプロジェクト、もう1つはMicrosoft単体テストプロジェクトです。次のようなデータオブジェクトを使用してWCFサービスプロジェクトをセットアップします。

[DataContract]
public enum Priority
{
    Low,
    Medium,
    High
}

[DataContract]
public struct TimeInfo
{
    [DataMember]
    public Int16 EstimatedHours { get; set; }

    [DataMember]
    public Int16 ActualHours { get; set; }

    [DataMember]
    public DateTime StartDate { get; set; }

    [DataMember]
    public DateTime EndDate { get; set; }

    [DataMember]
    public DateTime CompletionDate { get; set; }
}

[DataContract]
public class Task
{
    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public Priority Priority { get; set; }

    [DataMember]
    public TimeInfo TimeInformation { get; set; }

    [DataMember]
    public Decimal Cost { get; set; }
}

私の契約は次のようになります。

[ServiceContract]
public interface ITaskManagement
{
    [OperationContract]
    List<Task> GetTasks();

    [OperationContract]
    void CreateTask(Task taskToCreate);

    [OperationContract]
    void UpdateTask(Task taskToCreate);

    [OperationContract]
    void DeleteTask(Task taskToDelete);
}

このコードを使用して、WPFアプリケーションまたは単体テストプロジェクトのいずれかでサービスを使用しようとすると、次のようになります。

var client = new TaskManagementClient();

textBox1.Text = client.GetTasks().ToString();

client.Close();

次のエラーが発生します:「基になる接続が閉じられました:接続が予期せず閉じられました。」

WPFおよび単体テストプロジェクトのapp.configは、次のようになります。

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_ITaskManagement" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="Message">
                    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="Windows" negotiateServiceCredential="true"
                        algorithmSuite="Default" establishSecurityContext="true" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:9999/TaskManagement.svc"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ITaskManagement"
            contract="TaskManagement.ITaskManagement" name="WSHttpBinding_ITaskManagement">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

WCFサービスのweb.configは次のようになります。

    <system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="InternetBasedWcfServices.TaskManagementBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
            <behavior name="InternetBasedWcfServices.ScheduleManagementBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="InternetBasedWcfServices.TaskManagementBehavior"
            name="InternetBasedWcfServices.TaskManagement">
            <endpoint address="" binding="wsHttpBinding" contract="InternetBasedWcfServices.ITaskManagement">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
        <service behaviorConfiguration="InternetBasedWcfServices.ScheduleManagementBehavior"
            name="InternetBasedWcfServices.ScheduleManagement">
            <endpoint address="" binding="wsHttpBinding" contract="InternetBasedWcfServices.IScheduleManagement">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
</system.serviceModel>

これが起こったのはこれが初めてではなく、構成の問題だと思います。しかし、私は通常、サービスを吹き飛ばして元に戻すか、新しいサービスプロジェクトを作成するたびに。その後、すべてが素晴らしく機能します。誰かが何かアイデアを持っているなら、それは素晴らしいでしょう。どうも。

**

更新:この問題に関するトラブルシューティングの詳細についてコメントを追加しました。回答があり、未公開の場合は正式な「回答」として追加します。

**

4

12 に答える 12

21

答えを見つけた

わかりました、それが私自身の質問に答えるキールかどうかはわかりませんが、ここに行きます. 何らかの理由で、以下のように [EnumMember] 属性で列挙をマークする必要がありました。

[DataContract]
public enum Priority
{
    [EnumMember]
    Low,
    [EnumMember]
    Medium,
    [EnumMember]
    High
}

これを行うと、エラーが発生することなくテストとサービスを呼び出すことができました。その特定のエラーが表示された理由はまだわかりません。エラーは、エラーが発生した機能的な理由とは相関していないようですが、この修正により、すべてが確実にスムーズになりました。

于 2008-10-24T17:46:50.900 に答える
7

あなた自身が指摘したように、列挙型を DataContract としてマークする場合は、アイテムもマークする必要があります。

別の方法として、次のように列挙の前に [DataContract] を削除することもできます。

public enum Priority
{    
  Low,    
  Medium,    
  High
}

この場合、WCF は列挙型を単独で処理するため、これも機能します。[DataContract] としてマークする場合は、自分で気付いたようにすべての項目にマークを付ける必要があります。

于 2009-01-07T08:44:59.960 に答える
6

大きなペイロードを返すときにこのエラーが発生しました。DataContractSerialiser がデフォルトの maxItemsInObjectGraph 設定に達したためストリームの途中で停止していることが判明し、エンドポイントの動作に以下を追加すると問題が修正されました

<dataContractSerializer maxItemsInObjectGraph="2147483647" />
于 2011-10-19T07:17:18.583 に答える
3

FaultException以外のものがスローされて、クライアントに戻されないようにしてください。

于 2008-10-24T03:37:25.980 に答える
2

他の誰かがこれを行っている場合に備えて、linq によって生成されたオブジェクトのリストを sql/dbml ファイルに返します。dbml ファイルでシリアル化を有効にする必要がありました。

http://blogs.msdn.com/b/wriju/archive/2007/11/27/linq-to-sql-enabling-dbml-file-for-wcf.aspx

乾杯

于 2012-04-12T05:13:47.787 に答える
1

私はかなり外れている可能性がありますが、それはセキュリティの問題かもしれません...以前にそのエラーが発生し、解決しました...しかし、さまざまなバグを解決しようとして何日も起きていました.

基本的なことを行うサンプル記事がありますが、ここでは net.tcp (セキュリティを "None" に設定) を使用しています: Net.Tcp を使用して IIS でホストされている Duplex WCF Services

また、どこでエラーが発生していますか...「.Close()」行ですか、それとも「.GetTasks().ToString()」行ですか?

確認できるもう 1 つのことは、単純にポート 9999 で localhost に telnet して、サービスが受信接続を完全にリッスンしているかどうかを確認することです。

于 2008-10-24T02:53:27.033 に答える
1

このエラーは、非常に誤解を招く場合があります。Common WCF Exception : Connection Unexpectedly Closed は、カルチャが正しく設定されていない場合、または文字列形式でも発生する可能性があります。

以下は失敗します:

new DateTime(adate.Year, adate.Month, firstday).ToString("d", cultureInfo);

これが機能している間:

CultureInfo culture = new CultureInfo(this.aculture.Name);               
Convert.ToString(new DateTime(adate.Year, adate.Month, firstday), culture);
于 2010-04-07T14:27:37.440 に答える
1

別の理由: この例外は、具象型でDataContract/DataMemberはなく に属性があり(ひどい考えです、やらないでください)、 をシリアル化しようとしている場合に発生します。InterfaceConcrete type

于 2012-09-18T08:54:02.240 に答える
1

私の場合、カスタム クラス オブジェクトを返していましたが、そのメンバーの 1 つはデータ テーブルでした。データテーブルに名前がない場合、このエラーがスローされます。

Dim oTable As DataTable = New DataTable 'this wont serialize
Dim oTable As DataTable = New DataTable("MyTable")  'this will serialize
于 2012-12-18T15:26:10.010 に答える
0

このスレッドの誰かが、この要素をエンドポイントの動作に追加すると問題が解決したと投稿しました。

<dataContractSerializer maxItemsInObjectGraph="2147483647" />

これは機能しましたが、エンドポイントの動作だけでなく、サービスの動作にも追加する必要がありました (シリアル化が行われる場所であるため、これは理にかなっています)。

サービスのみに追加された場合、「オブジェクト グラフでシリアライズまたはデシリアライズできるアイテムの最大数は '65536' です。オブジェクト グラフを変更するか、MaxItemsInObjectGraph クォータを増やしてください。」というエラーが表示されました。

エンドポイントのみに追加した場合でも、接続が予期せず閉じられたというエラーが発生します。

于 2012-03-01T21:11:34.393 に答える