有没有办法从.Net客户端捕获.asmx web服务返回的HTTP500错误?
使用.Net 4.5 (VS2015),.Net客户端代码使用.asmx web服务,并使用以下代码调用它:
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客户端代码抛出异常?
发布于 2016-05-03 03:36:18
我在axis (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;
}
}发布于 2016-04-30 02:46:19
稍微研究一下,似乎从ASMX抛出的所有错误都是以SoapException类的形式抛出的,所以使用该类的try catch应该足以处理该错误。
Further reading on ASMX exception handling
nivlam还提出了一个很好的解决方案,可以从this answer上的ASMX和SOAP读取原始请求数据,您可能会从中获得错误代码。
发布于 2016-05-05 15:21:47
几年前我也遇到过类似的问题。HTTP500状态码的问题是服务调用无法到达服务器。所以你不能调试它。对我有效的解决方案是,确保参数具有与web方法定义的完全相同的模式。数据约定中的任何不匹配都可能导致HTTP 500内部服务器错误。
https://stackoverflow.com/questions/33389489
复制相似问题