0

WCFを使用していて、オブジェクトのリスト(または配列)をクライアントに返そうとしています。標準タイプでは正常に機能しているようで、カスタムオブジェクトを返すことはできますが、カスタムオブジェクトのリストを返すことはできません(リストに項目が1つしかない場合でも)。

私はこのトピックについてかなりの量を読みましたが、それでどこにも到達できないようです。コンパイルは問題ありませんが、クライアント側では、関数に到達すると、クライアントが例外をスローします

「HTTP応答の受信中にエラーが発生しました。これは、サービスエンドポイントのバインドがHTTPプロトコルを使用していないことが原因である可能性があります。これは、HTTP要求コンテキストがサーバーによって中止されていることが原因である可能性もあります(サービスがシャットダウンしている可能性があります)。詳細については、サーバーログを参照してください。」

私はいくつかのアイデアを試しましたが、現在私のオブジェクトは次のようになっています。

[DataContract]
    public class FilePacket : IDisposable
    {
        //[MessageHeader(MustUnderstand = true)]
        [DataMember]
        public string fileName;

        //[MessageHeader(MustUnderstand = true)]
        [DataMember]
        public long fileSize;

        //[MessageBodyMember(Order = 1)]
        [DataMember]
        public System.IO.Stream fileByteStream;

        public void Dispose()
        {
            if (fileByteStream != null)
            {
                fileByteStream.Close();
                fileByteStream = null;
            }
        }
    }
4

2 に答える 2

1

最初に行う必要があるのは、バインディングで使用transferModeしているかどうかを確認することです。Streamed

<system.serviceModel>
     …
    <bindings>
      <basicHttpBinding>
        <binding name="ExampleBinding" transferMode="Streamed"/>
      </basicHttpBinding>
    </bindings>
     …
<system.serviceModel>

2番目に使用する必要がありますMessageContract

[MessageContract]
public class FilePacket
{
   [MessageHeader]
   public string fileName;

   [MessageBodyMember]
   public System.IO.Stream fileByteStream;

   ...
}

fileByteStream残りのプロパティ以外は、MessageHeader属性で装飾する必要があります。

maxReceivedMessageSize最後に、サイズの制限を克服するために、プロパティに正しい値を設定していることを確認してください。

これらの参考資料を参照してください

http://msdn.microsoft.com/en-us/library/ms733742.aspx

http://msdn.microsoft.com/en-us/library/ms789010.aspx

于 2012-07-09T19:05:39.033 に答える
0

私は今これを機能させています(助けてくれてありがとう)。うまくいかず、問題を引き起こす可能性のあるさまざまなことがあるようです。まず、StreamからMemoryStreamに変更しました。そして、それが全体を通してそのように使用されていることを確認しました(DataContractをStreamを使用するように設定し、実際にFileStreamを使用できるいくつかのオプションを試しているときに気づきました。これにより大混乱が発生し、気付くのに数分かかりました) 。

DataContractからMessageContractに変更しました(MemoryStreamを[MessageBodyMember(Order = 1)]として設定するようにします)。

App Configで、transferModeを「Streamed」に設定し、maxBufferSizeが巨大な値に設定されていることを確認しました。

于 2012-07-10T09:25:46.653 に答える