有没有办法从.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客户端代码抛出异常?
答案 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
nivlam还提供了一个很好的解决方案,可以在this answer上从ASMX和SOAP读取原始请求数据,并且您可能从那里获得错误代码。
答案 2 :(得分:0)