在将WCF消息发送到服务器之前编辑它

时间:2015-12-14 18:43:05

标签: c# asp.net web-services wcf

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

1 个答案:

答案 0 :(得分:0)

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