2011-03-30 71 views
6

我正在使用Visual Studio創建的WCF服務。MonoTouch:WCF服務和異常處理

我正在做一個調用,如GetDataAsync(param)來檢索數據。在GetDataCompleted處理程序中,我使用檢索的數據。

服務有效。有時我無法檢索數據。在這種情況下,發生如下異常:

Exception in async operation: System.Net.ProtocolViolationException: The number of bytes to be written is greater than the specified ContentLength. 
    at System.Net.WebConnectionStream.CheckWriteOverflow (Int64 contentLength, Int64 totalWritten, Int64 size) [0x00038] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/WebConnectionStream.cs:546 

怎麼可能找到類似的excpetion?應用程序仍在工作,但例外情況在控制檯中打印。我認爲這個例外來自Channel或其他東西。

預先感謝您。

+0

嘿,你有想過嗎?我在單一框架上有一個相同的問題,在Apache上使用mod_mono運行HttpWebRequest,WebRequest和WebClient類。 只有當http請求有一個主體時(如果主體爲空且contentlength爲0,則不會發生此問題)。 服務器重新啓動後的第一個請求始終成功,但所有後續請求都不成功,並返回您描述的錯誤。 如果您有任何信息請幫助:-) Br。 Morten – Maate 2011-09-24 16:04:06

+1

正在使用哪種版本的MonoTouch?上述消息**「異步操作中的異常」**僅在** MOONLIGHT **配置文件中發現,因此它不應該在*控制檯*上打印任何內容。 – poupou 2011-09-26 22:55:50

回答

2

不幸的是,目前這些WCF異常無法在Monotouch中捕獲。這似乎是一個已知的錯誤。請參閱MonoTouch - WCF Services made by Silverlight tool - Can't catch exceptions

+0

嗯..我想這確實回答了這個問題,因此賞金。然而,我的實際問題是OP問題的子部分,該協議異常是隨機發生的。它通過WebClient類和(Http)WebRequest類完成。所以,基本上我不在乎我能不能抓住它 - 我根本不希望它發生。我通過在System.Net.TcpClient的頂部直接編寫一個簡單的HTTP客戶端來解決這個問題。這不是很漂亮,但它似乎是穩定的,並將爲我工作,直到一般錯誤得到解決。 – Maate 2011-10-01 13:12:34

0

當使用WCF時總是盡力獲得儘可能多的可見性。我經常使用兩種工具。他們是WCF跟蹤查看器和WCF配置編輯器

  • SvcConfigEditor.exe
  • SvcTraceViewer.exe

如果你是一個64位或X84機和.Net的版本,他們應該是根據也位於

  • C:\ Program Files文件\微軟的SDK \的Windows \ v6.0A \ BIN \
  • C:\ Program Files文件\微軟的SDK \的Windows \ v7.0A \ BIN \
  • C:\ PROGRAM文件(x86)\微軟的SDK \的Windows \ v6.0A \ BIN
  • C:\ Program Files文件(x86)的\微軟的SDK \的Windows \ v7.0A \ BIN退房

退房http://merbla.blogspot.com/2009/02/wcf-tools.html

2

你r的問題是:

如何捕獲類似的(red:ProtocolViolationException)異常?

在服務應用程序,趕ProtocolViolationException用下面的代碼:

catch (ProtocolViolationException ex) 
{ 
    // do something with your exception here 
    // for example, throw a FaultException that will be communicated to the client 
    throw new FaultException<ProtocolViolationException> 
     (ex, new FaultReason(ex.Message), new FaultCode("Sender")); 
} 

對於這個正確發送回客戶端,你需要建立一個附加屬性上的操作合同,如:

[OperationContract()] 
[FaultContract(typeof(ProtocolViolationException))] 

,然後在客戶端,你可以預見這個特定的異常並優雅地處理它,比如:

catch (FaultException<ProtocolViolationException> ex) 
{ 
    Console.WriteLine("FaultException<>: " + ex.Detail.GetType().Name + " - " + ex.Detail.Message); 
} 

這是否回答你的問題?