如何将 HTTP 响应直接流式传输到网络

本文关键字:传输 网络 HTTP 响应 | 更新日期: 2023-09-27 18:35:14

我正在使用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);
}

感谢您的帮助!

如何将 HTTP 响应直接流式传输到网络

只有 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
    }
}

在服务器端更改绑定配置(在本例中为流响应)

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

这是传输模式枚举:

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

注意:

  • 不要忘记在客户端为大型流设置 maxReceivedMessageSize = "some value"
  • 使用
  • 流式处理时,不能使用消息级传输安全性。
  • 当合约配置了 SessionMode.Required 时,不能使用流式处理。
  • 使用 TCP 绑定进行流式传输时,您也无法启用可靠的 消息。

您可以组合 REST 和 WCF 流式处理。例如,看看这里。