如何从WCF服务读取流

时间:2010-08-28 09:53:08

标签: wcf

我创建了一个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 个答案:

答案 0 :(得分:4)

您需要configure streaming使用您所使用的绑定。 BasicHttpBindingNetTcpBindingNetNamedPipeBinding支持流式传输。因此,如果您有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(...));

所以这真的取决于你通过网络发送的内容。

答案 1 :(得分:0)

如果你提到

response.ContentType = "text/xml"

在返回流之前

,接收应用程序可以知道流的类型,因此可以调用流的标准方式作为参考。