2015-12-14 75 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