繁体   English   中英

状态码无效时,如何获取http响应正文?

[英]How to get http response Body when the status code is not valid?

我正在尝试从私有服务获取html页面内容。 该页面返回状态码0,这是无效的。 但是在通过浏览器浏览时,页面会呈现。

当我尝试使用WebResponse.GetResponseStream( )时,它只是返回空流。 当我尝试使用HttpClient.GetStringAsync(url) .Result时,它将引发AggregateException ,如下所示:

System.AggregateException was unhandled
  HResult=-2146233088
  Message=One or more errors occurred.
  Source=mscorlib
  StackTrace:
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at System.Threading.Tasks.Task`1.get_Result()
   at DiagnosticInfoCrawler.Program.Main(String[] args) in c:\TFS\MSNMetro\Tools\Verticals\Sports\DiagnosticInfoCrawler\Program.cs:line 47
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.Net.Http.HttpRequestException
   HResult=-2146233088
   Message=Response status code does not indicate success: 0 ().
   InnerException: 

两种类型的代码如下:

WebResponse response = GetWebResponse(url);
responseBody = (new StreamReader(response.GetResponseStream())).ReadToEnd();

HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(url);
pageSource = httpClient.GetStringAsync(url).Result;

任何人都可以建议我如何获得响应机构? (假设我无法控制该服务以返回正确的状态代码。)

谢谢DD

捕获WebException以获取响应。 由于非200代码可能是正常情况的一部分,因此Microsoft的设计决策很差。

try
{
    WebResponse response = GetWebResponse(url);
    responseBody = (new StreamReader(response.GetResponseStream())).ReadToEnd();

    HttpClient httpClient = new HttpClient();
    httpClient.BaseAddress = new Uri(url);
    pageSource = httpClient.GetStringAsync(url).Result;
}
catch (WebException exception)
{
    var response = (HttpWebResponse)exception.GetResponse();
    //the response is here..
}

没有直接解决此问题,而是转到使用TcpClient读取响应的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM