我有一个我在Silverlight中访问的WCF服务。 Silverlight应用程序需要身份验证(通过调用服务进行身份验证。)
我注意到,当经过身份验证的会话超时并且用户执行应用程序端会调用该服务时,应用程序会挂起等待服务响应。我的服务旨在在这些情况下输出异常,但是Silverlight端没有分配任何异常,而是抛出异常:
用户代码未处理CommunicationException
远程服务器返回错误:NotFound。
在我的服务方法中,我检查用户是否仍然经过身份验证,如果是,我继续操作。如果没有,我为out参数赋值(Exception类型)。在Silverlight端,我检查此异常是否为null,否则采取适当的操作。当我执行时,out参数被赋予了正确的异常,但是然后Silverlight抛出上面的异常(在Reference.cs中),直到它到达我可以处理它的位置......
有没有人见过这个?有什么建议吗?
编辑:似乎有任何类型的异常,包括继承和包含它们,都会导致上述异常。我发现解决这个问题的最简单方法就是将异常信息传递给我自己的自定义Exception对象(同样,不能包含System.Exception对象)
答案 0 :(得分:0)
有关更多信息的想法和要求:
您是否已针对控制台应用检查了WCF服务,一切都按预期工作?
您可以从Silverlight应用程序对WCF服务进行调用,此行为仅在经过身份验证的会话超时后才会发生?
您是否在Silverlight应用的整个生命周期中保持与WCF的连接?如果是这样,我建议只根据需要打开和关闭它。这样,您只应在会话通过身份验证时调用它。
答案 1 :(得分:0)
在服务中启用WCF日志记录并查看输出内容。它通常比“NotFound”更具信息性。以下是有关如何配置WCF日志记录的一些信息:
http://msdn.microsoft.com/en-us/library/ms730064.aspx
答案 2 :(得分:0)
这个网站似乎解释了我遇到的情况: Understanding WCF Services in Silverlight
显然Silverlight会因任何异常而获得400错误,但不会有太多线索这个异常是什么。
作者提供了一个解决方案,但我有点困惑,因为我得到的例外并没有被抛出,只是被分配了。我认为我的实施会有效......任何人都可以提供任何见解吗?
答案 3 :(得分:0)
在这里看看我的答案:
Random "Not Found" error with Silverlight accessing ASP.NET Web Services
这适用于asmx服务,但同样适用于WCF服务。 WCF故障不会传递给silverlight应用程序。它只是从响应中获取404状态代码。
答案 4 :(得分:-1)
除非为您正在访问的WCF服务定义了特殊的端点行为(请参阅http://msdn.microsoft.com/en-us/library/dd470096(VS.95).aspx),否则浏览器网络堆栈会将所有Web服务异常转换为404 - 这就是您所观察到的。
所以你有两个选择:
如果您无法修改WCF服务的行为,可以通过将这些行添加到App.xaml.cs文件来切换到客户端网络堆栈:
HttpWebRequest.RegisterPrefix(“https://”,WebRequestCreator.ClientHttp); HttpWebRequest.RegisterPrefix(“http://”,WebRequestCreator.ClientHttp);`
这将确保您在Silverlight而不是404中获得实际错误。
显然,切换到客户端网络堆栈有其自身的缺点(例如,您必须自己处理身份验证,缓存,cookie)