在用Asp.net开发Webservice是简单而且轻松地,这就导致很多时候我们不去关心SOAP,UDDI,WDSL.对于刚写Webservice程序的时候,对提供方法的健壮和异常处理都未做考虑。
由于我也是初学者,对webservice没有关注,通过Google对SOAP和Asp.net下的Webservice Exceptiion 的搜索发现,其实SOAP对异常进行了很好的标签体
SOAP 的 Fault 元素用于下列子元素:
子元素 | 描述 |
---|---|
<faultcode> | 供识别故障的代码 |
<faultstring> | 可供人阅读的有关故障的说明 |
<faultactor> | 有关是谁引发故障的信息 |
<detail> | 存留涉及 Body 元素的应用程序专用错误信息 |
MS已经做好了Webservice异常处理的封装,我们其实不用做太多的处理就能很好的完成服务器端和客户端的异常
如果服务器端抛出一个简单异常:
Throw New Exception("发生了一些错误!");
客户端收到的SOAP的body内将是fault节点信息,如下:
<
soap:Fault
>
< faultcode > soap:Server </ faultcode >
< faultstring > System.Web.Services.Protocols.SoapException: Server was unable to process request. --- > System.Exception: 发生了一些错误!at AYS17Sept2002.Service1.CallFault() in c:/inetpub/wwwroot/AYS17Sept2002/Service1.asmx.vb:line 49 --- End of inner exception stack trace --- </ faultstring >
< detail />
</ soap:Fault >
< faultcode > soap:Server </ faultcode >
< faultstring > System.Web.Services.Protocols.SoapException: Server was unable to process request. --- > System.Exception: 发生了一些错误!at AYS17Sept2002.Service1.CallFault() in c:/inetpub/wwwroot/AYS17Sept2002/Service1.asmx.vb:line 49 --- End of inner exception stack trace --- </ faultstring >
< detail />
</ soap:Fault >
由于这样的异常信息会让调用端知道具体的代码结构,存在风险,MS推荐了SoapException异常类
Throw New SoapException( "Server was unable to process request.",SoapException.ServerFaultCode);
这样的异常只会显示"Server was unable to process request"异常信息,而不会过多显示堆栈信息,避免暴露代码结构。
<faultstring>Server was unable to process request</faultstring>
同时我们也可以通过配置 /configuration/system.web/customErrors/@mode来关闭和开启堆栈信息,默认是RemoteOnly,我们可以设置为:
- On
- Off
设置为On将不向客户端显示堆栈跟踪信息