我试图使用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服务”模板后得到了错误。纠正服务宿主文件的问题得到了解决。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top