2015-12-14 60 views
1

我们最近必须将我们的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只是我用来存储常用变量静态类。

回答

0

显然事实证明,一旦书面不能改变,所以创建一个带有调整标题的副本。等效问题提出here
无论如何,我鼓励你创建自定义消息检查器:类派生IClientMessageInspector,就客户而言。它提供了正在调用的方法和正在调整的头部之间的分离。

+0

我最终试图只使用OperationContext修改头文件而无法修改代码,而且我得到了同样的错误。基本上我只是叫“等待uploadFileAsync(请求);”我仍然有同样的例外。这没有什么意义,因为没有任何修改或调用UploadFileAsync和方法本身调用Channel.UploadFileAsync ... – user2357446

+0

因为您使用this.InnerChangel我假定类派生从ClientBase或DuplexClientBase。代理是否正确创建? – Maximus

+0

我编辑了我的原始文章以显示我如何设置代理 – user2357446

相关问题