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 回答