我有一个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是问题,但我可能是错的。
答案 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>