Windows Phone 7,Silverlight - 如何在调用异步Web服务时捕获EndpointNotFoundException?

6

我正在从Silverlight Windows Phone 7应用程序中调用一个Web服务,如果Web服务可用,则正常工作。如果Web服务不可用,则会捕获未处理的异常,但我似乎无法自己捕获它。我的尝试如下:

            //Get list of providers from Webservice
        RSAServiceClient proxy = new RSAServiceClient();
        proxy.GetSuppliersCompleted += new System.EventHandler<GetSuppliersCompletedEventArgs>(ProxyGetSuppliersCompleted);
        try
        {
            proxy.GetSuppliersAsync();
        }
        catch (EndpointNotFoundException)
        {
            //TODO: Handle webserice not being available
        }
        catch (Exception)
        {
            throw;
        }

但是这样做并没有捕获到异常,显然GetSuppliersCompleted从未被调用,所以我无法在那里捕获它。
然后我想也许可以通过检查连接状态(proxy.State)来检测它,但是即使Web服务没有运行,它仍返回CommunicationState.Opened。
有什么想法可以处理这个问题吗?
如果我错过了什么,请原谅,但我已经搜索过并没有找到解决方案。
3个回答

8

你应该将捕获放置在ProxyGetSuppliersCompleted方法中。

尝试访问结果会抛出你期望的错误。

或者在ProxyGetSuppliersCompleted中,你可以测试EventArgs的Error属性,其中包含异常信息。


1
ProxyGetSuppliersCompleted没有被调用,因为在由Visual Studio生成的Reference.cs中捕获了EndpointNotFoundException作为“未处理”的异常。 - Fishcake
2
抱歉,我误解了。因为在调试时,Visual Studio 在 Reference.cs 中断了,我没有继续执行。如果我继续执行(或者不进行调试),错误确实会在 ProxyGetSuppliersCompleted 中被捕获。干杯。 - Fishcake

0
我建议在执行任何代码之前,先检查您是否有互联网访问权限。只需检查是否有网络连接,如果没有,则通知用户。

值得做,但它并不能解决我的问题。 - Fishcake

-1

我有完全相同的问题。 行为与桌面版Silverlight不同,那里会处理异常,而WindowsPhone-Silverlight则根本不处理连接异常。

我在这里创建了一个主题:http://forums.create.msdn.com/forums/t/69485.aspx

没有人有真正的答案。 啊,是的,有一个技巧:您可以手动修改reference.cs以手动捕获异常...但如果您有很多函数,它就变成了一场噩梦。

也许Microsoft开发人员没有测试所有连接用例,并且他们忘记实现这个(这是一个大问题)。


你可以在异步方法的处理程序中捕获错误(例如我的示例ProxyGetSuppliersCompleted)。这个方法很有效,你还有什么问题吗? - Fishcake

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