我们最近不得不将Win 8.1商店应用升级到Win 10.部分更改是将NetTcpBindings修改为BasicHttpBindings用于文件上传,因为UWP目前不支持NetTcpBindings。我们的问题是,当客户端调用代理类上的UploadFileMethod
时,我们会在将消息发送到服务器之前拦截该消息,以便我们可以应用稍后使用的标头,如下所示:
public async Task UploadFileAsync(RemoteFileInfo request)
{
using (new OperationContextScope(this.InnerChannel))
{
string nameSpace = @"http://tempuri.org";
OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("FileName", nameSpace, request.FileName));
OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("Length", nameSpace,
request.Length));
await Channel.UploadFileAsync(request);
}
}
当我们使用NetTcpBinding
时,这常常工作正常,但由于我们切换到BasicHttpBinding
,该代码现在在行上抛出异常:
await Channel.UploadFileAsync(request);
除了阅读:
This message cannot support the operation because it has been written.
在阅读了这个异常后,看来我们在使用request
之前,在将BasicHttpBinding
对象发送到服务器之前根本不会弄乱它。如果是这种情况,我们如何使用OutgoingMessageHeaders
本身的属性将request
添加到邮件中?
编辑:代理类创建如下:
var imageProxy = new RTMImageServiceProxy(globalContext.Win10UploadBinding,
globalContext.ImageEndpointAddress);
Win10UploadBinding
的配置如下:
BasicHttpBinding win10BasicBinding = new BasicHttpBinding();
win10BasicBinding.Security.Mode = BasicHttpSecurityMode.None;
win10BasicBinding.TransferMode = TransferMode.Streamed;
win10BasicBinding.SendTimeout = new TimeSpan(0, 0, 2, 0);
win10BasicBinding.MaxReceivedMessageSize = 2147483647;
this.win10UploadBinding = win10BasicBinding;
和globalContext
只是我用来存储常用变量的静态类。
答案 0 :(得分:0)
显然事实证明,一旦写入不能改变,所以创建一个带有调整标题的副本。提出了同等问题here。
无论如何,我鼓励您创建自定义消息检查器:类导出 IClientMessageInspector ,就客户而言。它提供了被调用方法和被调整标头之间的分离。