Monotouch:WCF服务和异常处理

6

我正在使用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 

如何捕获类似的异常?应用程序仍在运行,但异常已在控制台打印出来。我认为这个异常是来自通道或其他东西。

提前谢谢。


嘿,你解决了吗?我在使用 mod_mono 在 Apache 上运行 HttpWebRequest、WebRequest 和 WebClient 类时,在 mono 框架上遇到了相同的问题。只有当 HTTP 请求具有正文时(如果正文为空且 contentlength 为 0,则不会出现问题)才会出现此问题。服务器重新启动后的第一个请求总是成功的,但是所有随后的请求都失败并返回你描述的错误。如果您有任何信息,请帮忙解决 :-)敬礼,Morten - Maate
1
正在使用哪个版本的MonoTouch?上述消息“异步操作中的异常”仅在MOONLIGHT配置文件中找到,因此不应在控制台上打印任何内容。 - poupou
3个回答

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); 
} 

这回答了你的问题吗?

2

嗯...我猜这确实回答了问题,因此设置了悬赏。然而,我的实际问题是OP问题的子部分,即协议异常会随机发生。它在WebClient类和(Http)WebRequest类中都会出现。所以,基本上我不在乎能否捕获它 - 我不希望它发生。我通过直接在System.Net.TcpClient之上编写一个简单的HTTP客户端来解决这个问题。它不太美观,但似乎很稳定,并且对我来说可以工作,直到一般性错误得到修复。 - Maate

0

在使用WCF时,尽可能获得更多的可见性总是很好。有两个工具我经常使用。它们是WCF Trace Viewer和WCF Config Editor。

  • 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接