.Net代码,用于捕获来自.asmx web服务的HTTP 500错误响应
本文关键字:服务 web HTTP 响应 错误 asmx 代码 用于 Net | 更新日期: 2023-09-27 18:19:39
是否有方法捕获.Net客户端.asmx web服务返回的HTTP 500错误?
使用.Net 4.5(VS2015),.Net客户端代码消耗.asmx web服务,并使用以下代码调用它:
var client = new WebserviceApi.MyServiceSoapClient();
var response = client.MyWebServiceMethod();
如果.asmx web服务返回HTTP 500错误,其中包含错误消息详细信息的SOAP消息,则"response"变量设置为null。
使用Fiddler,流量显示来自.asmx web服务的HTTP500响应。响应包含一条SOAP XML消息,其中包含有关错误的详细信息。
.Net客户端代码中不会引发或捕获异常,执行将照常进行。
这意味着客户端无法获取有关异常性质的信息。客户端代码所能做的就是检查"response"是否为null,但异常消息对客户端代码不可用。
如果.asmx web服务返回HTTP 500响应,是否有任何方法可以强制.Net客户端代码抛出异常,以便检查/记录错误消息?
我在axis(java)web服务方面遇到了类似的问题。他们抛出的异常并没有出现在我这边,尽管响应实际上是HTTP500。
我不能肯定这会解决你的问题,但我解决了我的问题,覆盖GetWebResponse方法,并在需要时自己抛出异常。
我在添加web引用后更改了Visual Studio生成的web服务客户端代码(生成的文件名为:Reference.cs,有时它在解决方案中不可见,您必须单击解决方案窗格顶部的"显示所有文件",然后展开您的web服务引用文件。
internal class ChangedWebServiceClient : SomeSoapService
{
protected override WebResponse GetWebResponse(WebRequest request)
{
var response = base.GetWebResponse(request);
if (response != null)
{
var responseField = response.GetType().GetField("_base", BindingFlags.Instance | BindingFlags.NonPublic);
if (responseField != null)
{
var webResp = responseField.GetValue(response) as HttpWebResponse;
if (webResp != null)
{
if (webResp.StatusCode.Equals(HttpStatusCode.InternalServerError))
throw new WebException(
"HTTP 500 - Internal Server Error happened here. Or any other message that fits here well :)");
}
}
}
return response;
}
}
仔细研究后,ASMX抛出的所有错误似乎都是SoapException类的形式,因此该类的try-catch应该足以处理该错误。
关于ASMX异常处理的进一步阅读
SoapException类
nivram还提出了一个很好的解决方案,可以在这个答案上读取ASMX和SOAP的原始请求数据,您可能会从中获得错误代码。
几年前我也遇到过类似的问题。HTTP500状态代码的问题是服务调用无法到达服务器。所以你无法调试它。对我有效的解决方案是确保参数与定义的web方法具有完全相同的架构。数据协定中的任何不匹配都可能导致HTTP 500内部服务器错误。