【问题标题】:Monotouch: WCF services and Exception handlingMonotouch:WCF 服务和异常处理
【发布时间】:2011-07-26 02:20:12
【问题描述】:

我正在使用使用 Visual Studio 创建的 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 

如何捕捉到类似的异常?应用程序仍在工作,但在控制台打印异常。我认为异常来自 Channel 或其他。

提前谢谢你。

【问题讨论】:

  • 嘿,你知道了吗?我在单声道框架上有一个等效的问题,其中 HttpWebRequest、WebRequest 和 WebClient 类在 Apache 上使用 mod_mono 运行。仅当 http 请求具有正文时才会出现此问题(如果正文为空且 contentlength 为 0,则不会出现此问题)。服务器重启后第一次请求总是成功的,但是后面的所有请求都不成功,返回你描述的错误。如果您有任何信息,请提供帮助:-) Br。莫腾
  • 正在使用什么版本的 MonoTouch?上述消息 “异步操作中的异常” 只能在 MOONLIGHT 配置文件中找到,因此它不应在 控制台 上打印任何内容。

标签: wcf exception-handling asynchronous mono xamarin.ios


【解决方案1】:

不幸的是,这些 WCF 异常目前无法在 Monotouch 中捕获。这似乎是一个已知的错误。见MonoTouch - WCF Services made by Silverlight tool - Can't catch exceptions

【讨论】:

  • 嗯.. 我想这确实回答了这个问题,因此是赏金。然而,我的实际问题是 OP 问题的子部分,即该协议异常是随机发生的。它通过 WebClient 类和 (Http)WebRequest 类来实现。所以,基本上我不在乎我能不能抓住它——我根本不希望它发生。我通过直接在 System.Net.TcpClient 之上编写一个简单的 HTTP 客户端来解决它。它不是很漂亮,但它似乎很稳定,并且在修复一般错误之前对我有用。
【解决方案2】:

你的问题是:

如何捕获类似的(红色: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); 
} 

这能回答你的问题吗?

【讨论】:

    【解决方案3】:

    在使用 WCF 时,尝试获得尽可能多的可见性总是好的。我经常使用两种工具。它们是 WCF 跟踪查看器和 WCF 配置编辑器

    • SvcConfigEditor.exe
    • SvcTraceViewer.exe

    取决于您使用的是 x64 还是 x84 机器以及 .Net 的版本,它们都应该位于其中。

    • C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\
    • C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\
    • C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\Bin
    • C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 查看

    查看http://merbla.blogspot.com/2009/02/wcf-tools.html

    【讨论】:

      猜你喜欢
      • 2020-06-09
      • 1970-01-01
      • 2014-09-24
      • 2021-05-21
      • 2015-06-06
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多