首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >WebException如何用身体获得整体反应?

WebException如何用身体获得整体反应?
EN

Stack Overflow用户
提问于 2012-08-06 21:02:52
回答 3查看 89.1K关注 0票数 118

在WebException中,我看不到GetResponse的主体。这是我在C#中的代码:

try {                
  return GetResponse(url + "." + ext.ToString(), method, headers, bodyParams);
} catch (WebException ex) {
    switch (ex.Status) {
      case WebExceptionStatus.ConnectFailure:
         throw new ConnectionException();                        
     case WebExceptionStatus.Timeout:
         throw new RequestTimeRanOutException();                     
     case WebExceptionStatus.NameResolutionFailure:
         throw new ConnectionException();                        
     case WebExceptionStatus.ProtocolError:
          if (ex.Message == "The remote server returned an error: (401) unauthorized.") {
              throw new CredentialsOrPortalException();
          }
          throw new ProtocolErrorExecption();                    
     default:
          throw;
    }

我看到了标题,但看不到正文。这是Wireshark对该请求的输出:

POST /api/1.0/authentication.json HTTP/1.1    
Content-Type: application/x-www-form-urlencoded    
Accept: application/json    
Host: nbm21tm1.teamlab.com    
Content-Length: 49    
Connection: Keep-Alive    

userName=XXX&password=YYYHTTP/1.1 500 Server error    
Cache-Control: private, max-age=0    
Content-Length: 106    
Content-Type: application/json; charset=UTF-8    
Server: Microsoft-IIS/7.5    
X-AspNet-Version: 2.0.50727    
X-Powered-By: ASP.NET    
X-Powered-By: ARR/2.5

Date: Mon, 06 Aug 2012 12:49:41 GMT    
Connection: close    

{"count":0,"startIndex":0,"status":1,"statusCode":500,"error":{"message":"Invalid username or password."}}

有没有可能以某种方式在WebException中看到消息文本?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-06 21:06:41

var resp = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();

dynamic obj = JsonConvert.DeserializeObject(resp);
var messageFromServer = obj.error.message;
票数 216
EN

Stack Overflow用户

发布于 2014-01-16 14:18:43

try {
 WebClient client = new WebClient();
 client.Encoding = Encoding.UTF8;
 string content = client.DownloadString("https://sandiegodata.atlassian.net/wiki/pages/doaddcomment.action?pageId=524365");
 Console.WriteLine(content);
 Console.ReadKey();
} catch (WebException ex) {
 var resp = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
 Console.WriteLine(resp);
 Console.ReadKey();
}
票数 44
EN

Stack Overflow用户

发布于 2021-05-14 00:43:36

我看不到任何using语句的答案,也看不到async的任何用途。

public static class WebExceptionExtensions
{
    public static string GetResponseBody(this WebException webException)
    {
        if (webException.Status == WebExceptionStatus.ProtocolError)
        {
            try
            {
                using (var stream = webException.Response.GetResponseStream())
                {
                    using (var reader = new StreamReader(stream))
                    {
                        string msg = reader.ReadToEnd();
                        if (string.IsNullOrEmpty(msg) && webException.Response is HttpWebResponse response)
                            msg = $"{response.StatusDescription} ({(int)response.StatusCode})"; // provide some error message if not found

                        return msg;
                    }
                }
            }
            catch (WebException) // we tried
            {
                return string.Empty;
            }
        }
        else
        {
            return string.Empty;
        }
    }

    public static async Task<string> GetResponseBodyAsync(this WebException webException)
    {
        if (webException.Status == WebExceptionStatus.ProtocolError)
        {
            try
            {
                using (var stream = webException.Response.GetResponseStream())
                {
                    using (var reader = new StreamReader(stream))
                    {
                        string msg = await reader.ReadToEndAsync();
                        if (string.IsNullOrEmpty(msg) && webException.Response is HttpWebResponse response)
                            msg = $"{response.StatusDescription} ((int){response.StatusCode})"; // provide some error message if not found

                        return msg;
                    }
                }
            }
            catch (WebException) //  we tried
            {
                return string.Empty;
            }
        }
        else
        {
            return string.Empty;
        }
    }
}

现在,每当我们捕获WebExceptions时,都很容易获得响应体。

try 
{
    // Do work here...
}
catch (WebException we)
{
    Console.WriteLine(we.GetResponseBody()); // synchronous
    Console.WriteLine(await we.GetResponseBodyAsync()); // or asynchronous
}
catch (Exception e)
{
    throw new Exception("Unexpected error occured", e);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11828843

复制
相关文章

相似问题

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