“随机”;“未找到”;Silverlight访问ASP.NET Web服务时出错

“随机”;“未找到”;Silverlight访问ASP.NET Web服务时出错,silverlight,web-services,silverlight-3.0,asmx,Silverlight,Web Services,Silverlight 3.0,Asmx,我正在用Silverlight 3和ASP.NET Web服务开发一个应用程序,它使用Linq to SQL从我的SQL Server数据库获取数据 当用户导致操作从我的任何web服务方法获取信息时,Silverlight会随机抛出类型为“CommunicationException”的异常“远程服务器返回错误:NotFound”,内部异常状态为“System.Net.WebExceptionStatus.UnknownError” 几乎有10%的请求会出现此错误。如果用户再次尝试获取相同的信息

我正在用Silverlight 3和ASP.NET Web服务开发一个应用程序,它使用Linq to SQL从我的SQL Server数据库获取数据

当用户导致操作从我的任何web服务方法获取信息时,Silverlight会随机抛出类型为“CommunicationException”的异常“远程服务器返回错误:NotFound”,内部异常状态为“System.Net.WebExceptionStatus.UnknownError”

几乎有10%的请求会出现此错误。如果用户再次尝试获取相同的信息,通常请求没有错误,用户获取数据


在Visual Studio中调试时,只有Silverlight会在异常时停止,我看不到找不到web服务的任何原因。

您看到的问题是,每当出现异常时,web服务不会向Silverlight客户端返回有关异常的任何详细信息。它只是返回404NotFound状态作为结果,因此您总是得到异常“NotFound”

您可以尝试做的是确保您的web服务即使在异常情况下也返回200(有效结果),并以某种方式随对象一起返回错误消息

例如:

public class WebServiceResult

{

   //your object's properties go here


   //extra properties to check if exception has occured

   public string ErrorMessage {get; set;}

   public bool IsError {get; set;}
}

用小提琴来更好地理解我说的话。在每个异常情况下,您都会看到404错误。

据我所知,WebClient将所有错误视为“404”。如果可以将代码切换为使用HttpClient,则会出现更多详细错误。如果该代码被隐藏(或生成),那么Fiddler将是您的最佳选择。

如果您碰巧正在使用WCF web服务,您可以尝试在web.config文件中打开WCF跟踪:

<configuration>
   <system.diagnostics>
      <sources>
            <source name="System.ServiceModel"
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true">
            <listeners>
               <add name="traceListener"
                   type="System.Diagnostics.XmlWriterTraceListener"
                   initializeData= "c:\CodePlex.Diagnostics\CodePlex.Diagnostics.Services.Web.svclog" />
            </listeners>
         </source>
      </sources>
   </system.diagnostics>
</configuration>


我建议您尝试描述导致错误的请求。也许可以用Fiddler之类的工具来观察网络流量。我以前在重新实例化web服务客户机对象(通过控件重载或其他方式)时见过这种情况;在我的应用程序中,这可能是巧合,但经过重构以确保不会出现这种情况,这似乎解决了问题。