WCF:使用与信息流的合同(WCF: using streaming with Message Co

2019-07-03 21:03发布

我试图使用WCF与信息流的合同,因为我需要流本身旁边附加参数。

基本上我创建一个文件上传和下载服务,顶部一些额外的逻辑。

不幸的是,当我尝试打从浏览器服务检查一切正常,我得到以下错误:

在“/”应用程序的服务器错误。 操作契约“IFileTransferService” UploadFile“使用具有SOAP头一个MessageContract。 SOAP头不被无MessageVersion支持。

不幸的是谷歌搜索,因为它没有产生任何显著的结果,帮助我。 你们可以帮助我吗? 这里的服务的细节(我已删除的原因的空间下载部分)。

[ServiceContract(Namespace = "http://www.acme.org/2009/04")]
public interface IFileTransferService
{
    [OperationContract(Action = "UploadFile")]
    void UploadFile(FileUploadMessage request);
}

[MessageContract]
public class FileUploadMessage
{
    [MessageHeader(MustUnderstand = true)]
    public FileMetaData Metadata { get; set; }

    [MessageBodyMember(Order = 1)]
    public Stream FileByteStream { get; set; }
}

[DataContract(Namespace = "http://schemas.acme.org/2009/04")]
public class FileMetaData
{
    [DataMember(Name="FileType", Order=0, IsRequired=true)]
    public FileTypeEnum fileType;

    [DataMember(Name="localFilename", Order=1, IsRequired=false)]
    public string localFileName;

    [DataMember(Name = "remoteFilename", Order = 2, IsRequired = false)]
    public string remoteFileName;
}

我曾尝试同时使用basicHttpBinding的和customhttp有没有积极的效果结合:

<customBinding>
    <binding name="customHttpBindingStream">
        <textMessageEncoding messageVersion="Soap12" />
        <httpTransport transferMode="Streamed" maxReceivedMessageSize="2147483647"/>
    </binding>
</customBinding>

更新 :阅读文档在线似乎与MessageContracts流确实应该是可能的。 参见例如到MSDN( 大数据和流数据 ):

针对流传输编程模型

对于流媒体,编程模型非常简单。 用于接收流式数据,指定一个具有一个单一的数据流类型的输入参数的操作的合同。 返回流数据,返回一个流的参考。 [...]这条规则同样适用于消息的合同。 如下面的消息合约显示,你只能有一个单一的主体部件上是甲流的消息协定。 如果你想用流以传送更多的信息,这些信息必须在邮件标题的持有。 消息体专门预留给所述流中的内容。

[MessageContract]
public class UploadStreamMessage
{
   [MessageHeader]
   public string appRef;
   [MessageBodyMember]
   public Stream data;
} 

我也看到从人完成文件上传的服务,博客文章和下载非常相似,我想(例如放在一起在这里 )。

更新2我试图创建一个小型控制台和自我托管与basicHttpBinding的服务,有它的工作原理就像一个魅力。 我开始相信,这个问题可能是在IIS托管。 任何的想法?

更新3见我自己的答案。

Answer 1:

我终于发现了什么是错误的:它无关,与肥皂版本有,溪流等...我只是拼写错误我自己的服务的名称,使用(!), FileTransfer ,而不是FileTransferService

最终basicHttpBinding的是完全正常的,我也没必要诉诸自定义绑定。

原件(坏的)版本:

<service 
    behaviorConfiguration="serviceBehavior"
    name="Acme.Service.FileTransfer">
    <endpoint address="" 
        name="basicHttpStream" 
        binding="basicHttpBinding"
        bindingConfiguration="httpLargeMessageStream" 
        contract="Acme.Service.IFileTransferService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>

新(固定)版本:

<service 
    behaviorConfiguration="serviceBehavior"
    name="Acme.Service.FileTransferService">
    <endpoint address="" 
        name="basicHttpStream" 
        binding="basicHttpBinding"
        bindingConfiguration="httpLargeMessageStream" 
        contract="Acme.Service.IFileTransferService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>

不过我不能说错误消息以任何方式是有必要了解什么是怎么回事....

如果你有兴趣在整个服务,您可以通过以下链接找到我的博客更多的细节: 与WCF文件传输



Answer 2:

您需要流都在请求和响应(的humonguous数据量传输,即)? 或者只是在响应(一般为:下载文件或大型数据集)?

如果你只需要上的反应,你应该尝试设置的transferMode为“StreamedResponse”:

<customBinding>
    <binding name="customHttpBindingStream">
        <textMessageEncoding messageVersion="Soap12" />
        <httpTransport transferMode="StreamedResponse" 
                       maxReceivedMessageSize="2147483647"/>
    </binding>
</customBinding>

在“流”设置将流是双向的 - 既要到服务器,以及从服务器响应请求,将流。 通常情况下,这不是理想的情况。



Answer 3:

我使用“WCF数据服务”模板来生成SVC文件,而不是“WCF服务”模板后,得到了错误。 纠正服务宿主文件的问题得到了解决。



文章来源: WCF: using streaming with Message Contracts