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

我正在尝试使用带有消息合同的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; } 

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

       

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

流媒体传输的编程模型

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

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

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

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

更新3看我自己的答案。

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

最后basicHttpBinding非常好,我不需要求助于自定义绑定。

原始(坏)版本:

     

新(固定)版本:

     

我仍然不能说错误信息有助于以任何方式理解这里发生了什么….

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

您是否需要在请求和响应中进行流式传输(即传输大量数据)? 或者仅仅是响应(通常是:下载文件或大型数据集)?

如果只需要响应,则应尝试将transfermode设置为“StreamedResponse”:

       

“流式”设置将以两种方式进行流式传输 – 来自服务器的请求以及来自服务器的响应都将进行流式传输。 通常情况下,这不是理想的情况。

使用“WCF数据服务”模板生成svc文件而不是“WCF服务”模板后,我收到错误。 更正服务主机文件问题已解决。