.Net代码从.asmx Web服务

时间:2015-10-28 11:11:35

标签: c# .net web-services asmx

有没有办法从.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消息,那么"响应"变量设置为null。

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

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

这意味着客户无法获取有关异常性质的信息。所有客户端代码都可以检查是否"响应"为null,但客户端代码无法使用该异常消息。

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

3 个答案:

答案 0 :(得分:4)

我对轴(java)Web服务有类似的问题。即使回复真的是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;
    }
}

答案 1 :(得分:2)

在研究了一下之后,似乎从ASMX抛出的所有错误都是SoapException类的形式,因此尝试捕获该类应该足以处理该错误。

Further reading on ASMX exception handling

SoapException Class

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

答案 2 :(得分:0)

几年前我遇到过类似的问题。 HTTP 500状态代码的问题是服务调用没有到达服务器。所以你无法调试它。对我有用的解决方案是确保参数具有与定义的Web方法完全相同的模式。数据协定中的任何不匹配都可能导致HTTP 500内部服务器错误。