.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客户端代码抛出异常,以便检查/记录错误消息?

.Net代码,用于捕获来自.asmx web服务的HTTP 500错误响应

我在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内部服务器错误。