基本上,我正在创建一个文件上传和下载服务,并在顶部添加一些额外的逻辑。不幸的是,当我尝试从浏览器访问服务以检查一切是否正常时,我收到以下错误:应用程序“/”中的服务器错误。合同“IFileTransferService”中的操作“UploadFile”使用带有SOAP标头的MessageContract。无MessageVersion不支持SOAP标头。不幸的是,谷歌搜索并没有产生任何重要的结果来帮助我。你们能帮帮我吗?以下是服务详情(由于篇幅原因,我删除了下载部分)。[ServiceContract(Namespace="http://www.acme.org/2009/04")]publicinterfaceIFileTransferService{[OperationContract(Action="UploadFile")]voidUploadFile(FileUploadMessagerequest);}[MessageContract]publicclassFileUploadMessage{[MessageHeader(MustUnderstand=true)]publicFileMetaDataMetadata{get;放;}[MessageBodyMember(Order=1)]publicStreamFileByteStream{get;放;}}[DataContract(Namespace="http://schemas.acme.org/2009/04")]publicclassFileMetaData{[DataMember(Name="FileType",Order=0,IsRequired=true)]publicFileTypeEnumfileType;[DataMember(Name="localFilename",Order=1,IsRequired=false)]publicstringlocalFileName;[DataMember(Name="remoteFilename",Order=2,IsRequired=false)]publicstringremoteFileName;我尝试使用basichttpbinding和customhttp绑定,但效果不佳:更新:在线阅读文档似乎可以使用MessageContracts完成流式传输。例如参考MSDN(BigDataandStreaming):TheProgrammingModelforStreaming流式编程模型很简单。要接收流数据,请指定一个操作合同,其中包含一个Stream类型的输入参数。要返回流数据,请返回Stream引用。[…]此规则也适用于邮件合同。如下面的邮件合同所示,您的邮件合同中只有一个文字成员是流。如果其他信息要与流通信,则此信息必须在消息头中。消息文本专为流媒体内容保留。[MessageContract]publicclassUploadStreamMessage{[MessageHeader]publicstringappRef;[MessageBodyMember]公共流数据;我也看到过人们做文件上传和下载服务的博客文章与我正在尝试组织的非常相似(例如这里)。更新2我尝试创建一个小型控制台并使用basicHttpBinding自行托管该服务,它非常有效。我开始相信问题可能出在IIS上。有任何想法吗?更新3查看我自己的答案。我终于弄清楚出了什么问题:它与Soap版本、流等无关……我只是拼错了自己的服务名称(!),使用的是FileTransfer而不是FileTransferService。最后,basicHttpBinding非常好,我不需要求助于自定义绑定。原始(损坏)版本:新(修复)版本:我仍然不能说错误消息以任何方式帮助理解这里发生了什么......如果你对整个服务感兴趣,你可以找到更多在我的博客上,链接如下更多详细信息:使用WCF进行文件传输您是否需要在请求和响应中流式传输(即传输大量数据)?或者只是响应(通常是:下载文件或大型数据集)?如果您只想要响应,您应该尝试将传输模式设置为“StreamedResponse”:“streamed”设置将以两种方式流式传输——来自服务器的请求和来自服务器的响应都将被流式传输。通常,这不是理想情况。使用“WCF数据服务”模板而不是“WCF服务”模板生成svc文件后,出现错误。更正服务主机文件问题已解决。以上就是C#学习教程:WCF:使用消息契约流,分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
