我正在尝试将 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 绑定,但效果不佳:
<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 查看我自己的答案。