C#学习教程:如何检查异步Web服务调用中的错误在客户端,如果对服务器的请求返回了http500之类的Http错误码,我如何从web服务客户端得知(我使用的是添加web引用自动生成的客户端代理)?George,在此先感谢George,由于您使用的是异步WS调用,因此您必须在回调方法中实现异常处理。例如:下面是我为演示异步委托而开发的示例代码。publicclassTransformDelegateWithCallBack{//////DelegatewhichpointstoAdapterTransform.ApplyFullMemoryTransformations()//////转换文件名///要处理的原始Xml数据///用于跟踪noofasync的变量委托///转换后的XML字符串publicdelegatestringDelegateApplyTransformations(stringfilename,stringrawXml,intcount);公共ArrayList结果数组;////声明异步委托和结果DelegateApplyTransformationsdelegateApplyTransformation;IAsyncResult结果;//////构造函数来初始化异步委托、结果和句柄到excel中的选项卡数量///publicTransformDelegateWithCallBack(){resultArray=ArrayList.Synchronized(newArrayList());}//////使用回调模型调用异步委托//////转换文件名///要处理的原始Xml数据///用于跟踪异步委托数量的变量publicvoidCallDelegates(字符串文件名,stringrawXml,intcount){尝试{AdapterTransformadapterTrans=newAdapterTransform();//在下面的stmt中,adapterTrans.ApplyFullMemoryTransformations是被调用的web方法delegateApplyTransformation=newDelegateApplyTransformations(adapterTrans.ApplyFullMemoryTransformations);//下面的stmt对web方法进行异步调用//因为它是一个异步操作,控制会立即流向下一行,最终从当前方法中出来。因此,Web服务中的异常(如果有的话)不会在这里被捕获。//CallBackMethod()是异步操作完成后将自动调用的方法//结果是一个IAsyncResult,它将在CallBackMethod中用于引用此委托//结果传递给CallBackMethodresult=delegateApplyTransformation.BeginInvoke(文件名、rawXml、计数、新的AsyncCallback(CallBackMethod)、null);}catch(CustomExceptionce){抛出ce;}}//////回调函数异步委托的k方法//////默认情况下,o将始终具有相应的AsyncResultpublicvoidCallBackMethod(objecto){try{AsyncResultasyncResult=(AsyncResult)o;//现在,当您执行EndInvoke时,如果Web服务抛出任何异常,它们将被捕获//resultString是Web方法返回的值。(Web方法的返回参数)stringresultString=((DelegateApplyTransformations)asyncResult.AsyncDelegate).EndInvoke((IAsyncResult)asyncResult);锁(this.resultArray.SyncRoot){this.resultArray.Add(resultString);}}catch(Exceptionex){//Handleex}}}如果您的WS调用抛出异常,则仅在AsynResult上执行EndInvoke它不会被捕获,直到您使用异步WS调用的即发即弃机制,EndInvoke不会被调用,所以异常会丢失。因此,当您需要捕获异常时,请始终使用回调机制希望这会有所帮助:)如果您有任何疑问,请告诉我。您可以为Web服务设置跟踪,MSDN中的方法如下:http://msdn.microsoft.com/en-us/library/bb885203.aspx如果您还可以访问服务器,则可以设置HealthMonitoring,用于例如,它会记录服务器端发生的任何错误,就像您发布500InternalServerError一样。健康监控-http://msdn.microsoft.com/en-us/library/ms998306.aspx如果您可以远程登录或登录服务器,您还可以使用有用的事件查看器。希望这会有所帮助:Andrew您可以从e.Response.GetResponseStream()获取信息。正如读者所指出的,您可能希望查看服务器端以获取更完整的信息。这是一个常见问题,因为Web服务只会在遇到未处理的异常时向您发送HTTP500(内部服务器错误)消息。我使用了很久以前发现的一个技巧。基本上,您需要使用StreamReader钻通WebException以确定异常的根本原因。示例代码:(抱歉,手边没有任何C#代码。请使用转换器)尝试“点击网络服务”。CatchexAsWebExceptionDimrAsHttpWebResponse=CType(ex.Response(),HttpWebResponse)UsingsrAsStreamReader=NewStreamReader(r.GetResponseStream())DimerrAsString=sr.ReadToEnd()'记录包含在“错误”变量。EndUsingReturnNothingFinally'CleanupEndTry可以使用我强烈推荐的DeveloperFusion转换器进行转换。参见上一个问题,简单易行地捕获所有未处理的异常网络。对于在IIS下运行的Web服务,似乎需要通过实现UnhandledExceptionModule来捕获所有线程中的异常。假设您有VisualStudio导入Web服务并使用MicrosoftWebServicesEnhancement3.0库,它可能看起来像这样:privatevoidDoWebService(){WSE.DoSomethingCompleted+=newMyWebService.DoSomethingCompletedEventHandler(WSE_DoSomethingCompleted);WSE.DoSomethingAsync(/*将参数传递给webservice*/);}catch(Exceptionex){//处理错误}}privatevoidWSE_DoSomethingCompleted(objecto,MyWebService.DoEifarventedArglets){(args.Error!=null){//下面获取错误并将其显示在消息框中StringBuildersb=新的StringBuilder();sb.AppendLine(args.Error.ToString());如果(args.Error.InnerException!=null){sb.AppendLine(args.Error.ToString());}MessageBox.Show(sb.ToString());}else{//对结果做一些事情}}任何错误都将在“MyWebService.DoSomethingCompletedEventArgs”对象返回。以上就是《C#学习教程:如何检查异步Web服务调用中的错误》分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
