WCF:使用与信息流的合同
-
20-09-2019 - |
题
我试图使用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托管。任何想法?
<强> UPDATE 3 强> 见我自己的答案。
解决方案
我终于发现了什么是错误的:它一点关系都没有用肥皂版本,溪流等...我只是拼写错误我自己的服务的名称,使用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
其他提示
您需要流既对请求和响应(的humonguous数据量即传输)?或只是在响应(一般为:下载文件或大的数据集)?
如果你只需要上的反应,你应该尝试设置的transferMode为“StreamedResponse”:
<customBinding>
<binding name="customHttpBindingStream">
<textMessageEncoding messageVersion="Soap12" />
<httpTransport transferMode="StreamedResponse"
maxReceivedMessageSize="2147483647"/>
</binding>
</customBinding>
在“流传输”设置将流两种方式 - 既要服务器,以及来自服务器的响应的请求,将被流传输。通常情况下,这不是理想的情况。
马克
我使用“WCF数据服务”模板以产生SVC文件,而不是“WCF服务”模板后得到了错误。纠正服务宿主文件的问题得到了解决。