WCF:使用流式传输与消息合同

Ste*_*rdi 20 .net c# wcf wcf-binding wcf-configuration

我正在尝试使用带有消息合同的WCF流,因为我需要在流本身旁边添加其他参数.

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

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

'/'应用程序中的服务器错误.合同'IFileTransferService'中的"UploadFile"操作使用具有SOAP头的MessageContract.None MessageVersion不支持SOAP标头.

不幸的是谷歌搜索它并没有产生任何帮助我的重要结果.你们能帮助我吗?这里是服务的细节(我已经删除了下载部分,因为空间的原因).

[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;
}
Run Code Online (Sandbox Code Playgroud)

我试图使用basichttpbinding和customhttp绑定,但效果不佳:

<customBinding>
    <binding name="customHttpBindingStream">
        <textMessageEncoding messageVersion="Soap12" />
        <httpTransport transferMode="Streamed" maxReceivedMessageSize="2147483647"/>
    </binding>
</customBinding>
Run Code Online (Sandbox Code Playgroud)

更新:在线阅读文档似乎确实可以使用MessageContracts进行流式传输.例如,参考MSDN(大数据和流):

流媒体传输的编程模型

流式传输的编程模型很简单.要接收流数据,请指定具有单个Stream类型输入参数的操作协定.要返回流数据,请返回Stream引用.[...]此规则同样适用于邮件合同.如以下消息合同中所示,您的消息协定中只能有一个正文成员,即流.如果要与流进行其他信息通信,则此信息必须是消息标头中的信息.消息正文专门为流内容保留.

[MessageContract]
public class UploadStreamMessage
{
   [MessageHeader]
   public string appRef;
   [MessageBodyMember]
   public Stream data;
} 
Run Code Online (Sandbox Code Playgroud)

我也看到人们完成文件上传和下载服务的博客文章非常类似于我想要整理的内容(例如这里).

更新2 我尝试创建一个小型控制台并使用basicHttpBinding自我托管服务,它就像一个魅力.我开始相信问题可能是IIS上的托管.任何的想法?

更新3 看我自己的答案.

Ste*_*rdi 8

我终于发现了什么是错误:它与Soap版本,流等无关......我只是错误地使用了自己的服务名称(!),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>
Run Code Online (Sandbox Code Playgroud)

新(固定)版本:

<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>
Run Code Online (Sandbox Code Playgroud)

我仍然不能说错误信息有助于以任何方式理解这里发生的事情....

如果您对整个服务感兴趣,可以通过以下链接在我的博客上找到更多详细信息:使用WCF进行文件传输