Как читать поток из сервиса WCF - PullRequest
0 голосов
/ 28 августа 2010

Я создал службу WCF для потоковой передачи файлов (загрузка). Код для услуги ниже

public Stream GetCoverScan(List<string> productIDs)
{
    FileStream stream = new FileStream("", FileMode.Open, FileAccess.Read);
    return stream;
}

Может кто-нибудь сказать мне, как я потребляю это на стороне клиента. Я уже создал прокси на клиенте, и я могу увидеть метод, создав объект службы, но как мне прочитать поток.

Пожалуйста, сообщите

Конфигурация

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="StreamedHttp" transferMode="StreamedResponse"
                     maxReceivedMessageSize="67108864">
            </binding>
        </basicHttpBinding>
    </bindings>
    <services>
        <service name="Streaming.Service1"
                 behaviorConfiguration="Streaming.Service1Behavior">
            <endpoint address="" bindingConfiguration="StreamedHttp"
                      binding="basicHttpBinding" contract="Streaming.IService1">
            </endpoint>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="Streaming.Service1Behavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

Договор

[ServiceContract]
public interface IService1
{
    [OperationContract]
    string GetData(string name);

    [OperationContract]
    System.IO.Stream GetCoverScan(List<string> productIDs);
}

привязки

</bindings>

Ответы [ 2 ]

4 голосов
/ 28 августа 2010

Вам необходимо настроить потоковую передачу в используемой привязке. Потоковая передача поддерживается для BasicHttpBinding, NetTcpBinding и NetNamedPipeBinding. Так что если у вас есть BasicHttpBinding, ваша конфигурация должна выглядеть следующим образом:

<basicHttpBinding>
    <binding name="HttpStreaming" maxReceivedMessageSize="67108864"
             transferMode="StreamedResponse"/>
</basicHttpBinding>

Я использую StreamedResponse здесь, потому что у вас есть только ответ, который должен быть потоком, а не запросом.

То, как вы читаете сам поток, зависит от того, что в нем. Предположим, что вы отправляете текстовый файл через поток, вы можете использовать StreamReader:

var reader = new StreamReader(service.GetCoverScan(...));
string contents = reader.ReadToEnd();

Если вы отправляете XML-файл, вы можете прочитать его через XDocument:

var doc = XDocument.Load(service.GetCoverScan(...));

Так что это действительно зависит от того, что вы отправляете по проводам.

0 голосов
/ 29 марта 2011

Если вы упомянули

response.ContentType = "text/xml"

непосредственно перед возвращающим потоком, принимающее приложение может знать тип потока, таким образом может вызывать стандартный способ потока какссылка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...