2012-03-31 33 views
4

我有一個允許用戶與之交互的windows phone應用程序。每次交互總是會導致異步的WCF調用。
除此之外,一些交互將導致打開瀏覽器,地圖,電子郵件等......即使調用'void'異步方法,返回按鈕上的'WebException'錯誤

的問題是,點擊返回按鈕時,我有時會收到以下錯誤
"An error (WebException) occurred while transmitting data over the HTTP channel."

以下堆棧跟蹤:
at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason) at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result) at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnGetResponse(IAsyncResult result) at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2) at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadPool.WorkItem.doWork(Object o) at System.Threading.Timer.ring()

我的理解是,它的發生,因爲我的應用程序打開另一個應用程序(瀏覽器,地圖等),它必須執行EndMyAsyncMethod(System.IAsyncResult result)的時間之前。公平的...

真的很煩人的是,它似乎應該通過克隆服務器端的方法得到修復,只使void與以下操作合同[OperationContract(IsOneWay = true)]但我仍然得到錯誤。

更糟糕的是,該異常是在系統生成的部分代碼中引發的,因此無法手動捕獲導致應用程序崩潰。

我只是不明白在明確標記爲OneWayvoid時需要執行​​方法。


編輯

我沒有找到一個類似的問題here。它似乎確實與消息進入服務(而不是客戶端回調)有關。我的下一個問題是:
如果我現在正在調用標記爲AsyncPatternOneWay的方法,我應該等待客戶端確定消息已成功傳輸?

這是新的服務定義:

[OperationContract(IsOneWay = true, AsyncPattern = true)] 
IAsyncResult BeginCacheQueryWithoutCallback(string param1, QueryInfoDataContract queryInfo, AsyncCallback cb, Object s); 

void EndCacheQueryWithoutCallback(IAsyncResult r); 

和實現:

public IAsyncResult BeginCacheQueryWithoutCallback(string param1, QueryInfoDataContract queryInfo, AsyncCallback cb, Object s) 
{ 
     // do some stuff 
     return new CompletedAsyncResult<string>(""); 
} 
public void EndCacheQueryWithoutCallback(IAsyncResult r) 
{ 
} 
+0

你能展示一些代碼,Web服務是如何被稱爲 – 2012-03-31 21:51:42

+0

感謝您的回覆西拉。我在客戶端上使用自動生成的代理,所以代碼沒有太多關於它的內容:MyProxy.CallWebServiceMethod(param1,param2); – BlazingFrog 2012-03-31 23:23:04

+0

我在原始文章中添加了一些代碼 – BlazingFrog 2012-03-31 23:26:56

回答

0

,這將保證消息的唯一的事情已經交付單向綁定可靠的轉向消息並確保沒有通信錯誤(地址錯誤,綁定等)這是支持可靠消息傳遞的綁定列表:

basicHttpBinding - RM not supported 

wsHttpBinding  - RM supported, not default 

wsDualHttpBinding - RM implicit 

netTcpBinding  - RM supported, not default 

例如,對於tcpBinding:

<binding> 
    <netTcpBinding> 
     <binding name="MyTcpBinding"> 
      <reliableSession enabled="true" /> 
     </binding> 
    </netTcpBinding> 
</binding> 

或者:

<customHttpBinding> 
    <binding configurationName="customReliableBinding"> 
     <reliableSession ordered="true" /> 
    </binding> 
</customBinding>