我正在尝试使用带有消息契约的WCF流,因为除了流本身之外,我需要其他参数。
基本上我正在创建一个文件上传和下载服务,并在其上添加一些附加逻辑。
不幸的是,当我尝试从浏览器访问服务以检查一切是否正常时,我会收到以下错误:
'/'应用程序中的服务器错误。 合同'IFileTransferService'中的操作'UploadFile'使用具有SOAP标头的MessageContract。 SOAP标头不受None 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和自定义http绑定,但没有取得积极的效果:
<customBinding>
<binding name="customHttpBindingStream">
<textMessageEncoding messageVersion="Soap12" />
<httpTransport transferMode="Streamed" maxReceivedMessageSize="2147483647"/>
</binding>
</customBinding>
更新:在线阅读文档后,看起来使用MessageContracts进行流式传输确实是可能的。例如,请参考MSDN (大数据和流式传输):
流传输编程模型
流传输的编程模型非常简单。要接收流式数据,请指定一个带有单个Stream类型输入参数的操作契约。要返回流式数据,请返回一个Stream引用。[...] 同样适用于消息契约。如下所示的消息契约中,您的消息契约中只能有一个主体成员是流。如果您想通过流传输附加信息,则必须将此信息放在消息头中。消息正文仅专门保留流内容。
[MessageContract]
public class UploadStreamMessage
{
[MessageHeader]
public string appRef;
[MessageBodyMember]
public Stream data;
}
我看过一些博客文章,这些人完成了非常类似于我正在尝试实现的文件上传和下载服务(例如这里)。
更新2: 我已经尝试创建一个小型控制台应用程序并使用basicHttpBinding自托管服务,那里它运行得非常好。我开始相信问题可能是在IIS上托管的问题。有什么想法吗?
更新3: 请看我的答案。
MessageBodyMember
属性中,Order = 1
是多余的,因为你只有一个正文元素。 - Ohad Schneider