Silverlight 3 WCF服务`CommunicationException`服务器返回错误:NotFound

时间:2009-12-01 20:48:32

标签: c# .net silverlight debugging exception

我有一个Silverlight 3应用程序,它有95%的时间成功从WCF服务(在同一个webapp中)请求数据并显示它。

这种情况很少发生,通常情况下,如果我快速点击服务很多次,但有时它会在单个请求中发生。

每隔一段时间,如果我在短时间内请求大量交易,我会得到两个例外中的一个,它们都出现在Reference.cs的{​​{1}}文件中。

有一些方法,其中任何一个都有异常。第一个是我理解的EndMyMethod(System.IAsyncResult result),它是有意义的,第二个,我完全没有得到的是“TimeoutException()未被用户代码处理:远程服务器返回错误:NotFound。“

我在CommunicationException()try..catch的处理程序中放置.MyMethodAsync()块都无济于事,因为生成的MyMethodCompleted文件中发生异常。

非常感谢任何帮助。

更新

Reference.cs - 由“添加服务参考”生成

Reference.cs

调用代码 - public System.IAsyncResult BeginTogglePicked(string ID, string toggle, System.AsyncCallback callback, object asyncState) { object[] _args = new object[2]; _args[0] = ID; _args[1] = toggle; System.IAsyncResult _result = base.BeginInvoke("TogglePicked", _args, callback, asyncState); return _result; } public void EndTogglePicked(System.IAsyncResult result) { object[] _args = new object[0]; // This is the line where the Exception is Thrown base.EndInvoke("TogglePicked", _args, result); } 是字符串列表,pickedIDs是在过程顶部定义的字符串。事件处理程序userIDSelecting目前是空的。

mdc_TogglePIckedCompleted

更新2

这是来自CommunicationException的“InnerException”:MapDataClient mdc = new MyDataClient(); mdc.TogglePickedCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(mdc_TogglePickedCompleted); foreach (string id in pickedIDs) { mdc.TogglePickedAsync(id, userIDSelecting, mdc); }

不确定这是否有用,因为它没有提供任何额外的细节。正如我所说,这种情况在我每次调用服务方法时都不会发生。我还想指出,同一个呼叫有时会起作用而不是其他呼叫,我开始认为这个问题是因为IIS无法响应我的服务电话,想法?

更新3

当我的意思是间接地说,我的意思是真实的内容。这可能仅在用户会话中发生一次,并且可能仅在五十个会话中的一个上发生。它不是一个全有或全无的作品。调用应用程序托管在与WCF服务相同的“webite”中,所以我不认为clintaccesspolicy.xml是问题,但我可能是错的。

5 个答案:

答案 0 :(得分:4)

你得到的信息可能是红鲱鱼: - (

当抛出内部WCF服务异常时,这些异常总是表现为Silverlight UI中的服务器未找到异常。这是因为HTTP响应是类型500.我读到的最好的文章来自David Betz - http://www.netfxharmonics.com/2008/11/Understanding-WCF-Services-in-Silverlight-2(这是为SL2编写的,但SL3的概念仍然适用。此外,他的一些方法是对于纯粹主义者 - 例如“永远”使用VS的“添加服务参考”功能 - 您不必遵循他的所有建议;-))

无论如何,回到你的问题,你需要将响应类型转换为200并解析消息中的异常。这可以使用MessageInspector(在服务和SL应用程序中)完成。

其中一些方法看起来相当令人生畏 - 需要一些时间才能理解这一点 - WCF&lt; - &gt;这个概念至关重要 SL 应用程序,一旦你得到它就有意义: - )

自今年年初以来,我们已经取得了很大的成功,所以如果您需要更多的帮助,请告诉我。

答案 1 :(得分:1)

在使用Silverlight和WCF时,我是否可以始终建议始终运行Fiddler

答案 2 :(得分:0)

您的服务是否将异常详细信息返回给客户端?默认情况下不会。您可以将以下属性添加到服务类中。

[ServiceBehavior(IncludeExceptionDetailInFaults=true)]
public class MyService ...

您可能会发现某些服务器端异常对客户端不可见。

答案 3 :(得分:0)

确保您有clientaccesspolicy.xml文件。否则,您可能会收到该错误,导致无法找到策略文件。

答案 4 :(得分:0)

我和你有完全相同的问题 - 绝对的噩梦,它有时会起作用,然后就会停止。

之前阅读你的帖子后,我一直在寻找clientaccesspolicy信息并找到了这个(不记得在哪里),但是我用它并且现在工作正常!

希望这对你有好处:)我的文件遗漏了allow-from部分的额外细节。

<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="http://*" />
        <domain uri="https://*" />

      </allow-from>


      <grant-to>
        <resource include-subpaths="true" path="/"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>