我们最近必须将我们的Win 8.1商店应用升级到Win 10.由于UWP当前不支持NetTcpBindings,因此部分修改是将我们的NetTcpBindings修改为BasicHttpBindings用于文件上载。我们的问题是,当客户端调用代理类UploadFileMethod
,我们截取的消息之前就被发送到服务器,这样我们就可以应用,以后用于标题如下:在发送到服务器之前编辑WCF消息
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.
看完这个例外之后,我们在使用BasicHttpBinding
发送到服务器之前,似乎根本不能搞砸request
对象。如果是这种情况,我们如何使用request
本身的属性将消息OutgoingMessageHeaders
添加到消息中?
编辑:代理类被创建如下:
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
只是我用来存储常用变量静态类。
我最终试图只使用OperationContext修改头文件而无法修改代码,而且我得到了同样的错误。基本上我只是叫“等待uploadFileAsync(请求);”我仍然有同样的例外。这没有什么意义,因为没有任何修改或调用UploadFileAsync和方法本身调用Channel.UploadFileAsync ... – user2357446
因为您使用this.InnerChangel我假定类派生从ClientBase或DuplexClientBase。代理是否正确创建? – Maximus
我编辑了我的原始文章以显示我如何设置代理 – user2357446