Как передать HTTP-ответ прямо в сеть

Я пишу веб-службу с высокой пропускной способностью, используя WCF 4.0 + REST. Веб-служба возвращает 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);
}

Спасибо за помощь!


person Martin    schedule 24.05.2012    source источник


Ответы (2)


Потоковую передачу поддерживают только привязки 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 = "некоторое значение" на стороне клиента для больших потоков.
  • При использовании потоковой передачи вы не можете использовать безопасность передачи на уровне сообщений.
  • Вы не можете использовать потоковую передачу, если контракт настроен с помощью SessionMode.Required.
  • При потоковой передаче с привязкой TCP вы также не можете включить надежный обмен сообщениями.
person Beygi    schedule 24.05.2012
comment
Вы забыли WebHttpBinding: он также поддерживает потоковую передачу. - person Dennis; 24.05.2012

Вы можете комбинировать потоковую передачу REST и WCF. Посмотрите здесь, например.

person Dennis    schedule 24.05.2012