我們最近必須將我們的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