首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于捕获来自.asmx web服务的HTTP500错误响应的.Net代码

用于捕获来自.asmx web服务的HTTP500错误响应的.Net代码
EN

Stack Overflow用户
提问于 2015-10-28 19:11:35
回答 3查看 3.9K关注 0票数 7

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

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

代码语言:javascript
复制
var client = new WebserviceApi.MyServiceSoapClient();

var response = client.MyWebServiceMethod();

如果.asmx web服务返回HTTP500错误以及包含错误消息详细信息的SOAP消息,则"response“变量将设置为null。

使用Fiddler,流量显示来自.asmx web服务的HTTP500响应。该响应包含一条SOAP XML消息,其中包含有关错误的详细信息。

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

这意味着没有关于异常性质的信息可供客户端提取。客户端代码所能做的就是检查"response“是否为空,但是异常消息对客户端代码是不可用的。

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

EN

回答 3

Stack Overflow用户

发布于 2016-05-03 03:36:18

我在axis (java) web服务上也遇到过类似的问题。他们抛出了异常,这些异常不会出现在我这一边,即使响应实际上是HTTP 500。

我不能确定这是否能解决您的问题,但我解决了我的问题,重写了GetWebResponse方法并在需要时自己抛出了异常。

我在添加web引用后更改了由Visual Studio生成的Web服务客户端代码(生成的文件名为: Reference.cs,有时它在解决方案中不可见,您必须单击解决方案窗格顶部的“显示所有文件”,然后展开您的web服务引用文件。

代码语言:javascript
复制
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;
    }
}
票数 5
EN

Stack Overflow用户

发布于 2016-04-30 02:46:19

稍微研究一下,似乎从ASMX抛出的所有错误都是以SoapException类的形式抛出的,所以使用该类的try catch应该足以处理该错误。

Further reading on ASMX exception handling

SoapException Class

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

票数 3
EN

Stack Overflow用户

发布于 2016-05-05 15:21:47

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33389489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档