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

Len*_*nny 5 .net c# web-services asmx

有没有办法从.Net客户端捕获.asmx Web服务返回的HTTP 500错误?

使用.Net 4.5(VS2015),.Net客户端代码使用.asmx Web服务并使用以下代码调用它:

var client = new WebserviceApi.MyServiceSoapClient();

var response = client.MyWebServiceMethod();
Run Code Online (Sandbox Code Playgroud)

如果.asmx Web服务返回HTTP 500错误,其中包含错误消息详细信息的SOAP消息,则"response"变量将设置为null.

使用Fiddler,流量显示来自.asmx Web服务的HTTP 500响应.响应包含SOAP XML消息,其中包含有关错误的详细信息.

在.Net客户端代码中没有抛出或捕获异常,执行继续正常进行.

这意味着客户无需了解有关异常性质的信息.所有客户端代码都可以检查"response"是否为null,但是异常消息对客户端代码不可用.

如果.asmx Web服务返回HTTP 500响应,有没有办法强制.Net客户端代码抛出异常,以便可以检查/记录错误消息?

Jak*_*ato 5

我对轴(java)网络服务有类似的问题。即使响应确实是 HTTP 500,他们也抛出了没有出现在我这边的异常。

我不能肯定地说这会解决你的情况,但我解决了我的覆盖 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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Jor*_*ise 3

经过一番研究后,发现从 ASMX 抛出的所有错误都是 SoapException 类的形式,因此对该类的 try catch 应该足以处理该错误。

进一步阅读 ASMX 异常处理

SoapException 类

nivlam 还提出了一个很好的解决方案,可以在此答案上从 ASMX 和 SOAP 读取原始请求数据,您可能会从那里获得错误代码。