3

WCF 4.0 + REST を使用して高スループットの Web サービスを作成しています。Web サービスは XML 応答を返します。私の操作メソッドの戻り値の型は XDocument で、WCF が XML を返すように処理します。ただし、XML 応答をメモリ内に作成して呼び出し元に返すのは、あまり効率的ではありません。

XmlDocument/XDocument から XmlWriter に移行しようとしています。コンソール アプリでは、ファイルへの応答を簡単にストリーミングできますが、WCF はどうでしょうか。ストリームを返す WebOperationContext、HttpContext を使用して応答をストリーミングできますか?

FileStream fs = new FileStream("New.xml", FileMode.Create, FileAccess.Write);
using (XmlWriter writer = XmlWriter.Create(fs))
{
    FormatResponse(writer, myDate);
}

助けてくれてありがとう!

4

2 に答える 2

1

TCP、IPC、WebHttpBinding、および basicHttp バインディングのみがストリーミングをサポートします。

契約の定義

[OperationContract]
Stream GetXml();

サービス メソッドの実装

public Stream GetXml()
{
    string filePath = "document.xml";

    try
    {
        FileStream xmlFileStream = File.OpenRead(filePath);
        return xmlFileStream;
    }
    catch (IOException ex)
    {
        // Exception handling logic
    }
}

サーバー側でバインディング構成を変更します (この場合は StreamedResponse)。

<bindings>
   <basicHttpBinding>
      <binding name = "StreamedHTTP"
               transferMode = "StreamedResponse"
      />
   </basicHttpBinding>
</bindings>

TransferMode列挙型は次のとおりです。

public enum TransferMode
{
   Buffered, //default
   Streamed,
   StreamedRequest,
   StreamedResponse
}

ノート:

  • 大規模なストリームの場合、クライアント側で maxReceivedMessageSize = "some value" を設定することを忘れないでください
  • ストリーミングを使用する場合、メッセージ レベルの転送セキュリティは使用できません。
  • コントラクトが SessionMode.Required で構成されている場合、ストリーミングは使用できません。
  • TCP バインディングでストリーミングする場合も、信頼できるメッセージングを有効にすることはできません。
于 2012-05-24T10:09:01.180 に答える
0

REST と WCF ストリーミングを組み合わせることができます。たとえば、ここを見てください。

于 2012-05-24T04:58:39.393 に答える