簡體   English   中英

C#HttpWebResponse,WebException

[英]C# HttpWebResponse, WebException

因此,我對C#還是比較陌生,但是我使用過其他語言。 目前,我正在編寫自定義MineCraft啟動器。 我正在使用Yggdrasil身份驗證文檔來幫助我做到這一點。 它說:如果請求成功,服務器將響應:

  • 狀態碼200
  • 根據以下規范的JSON編碼字典

但是,如果請求失敗,服務器將響應:

  • 適當的非200 HTTP狀態代碼
  • 遵循以下格式的JSON編碼字典:

我已經解決了第一部分,但是第二部分是問題所在!

HttpWebResponse httpResponse = null;
try
{
    httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        string result = streamReader.ReadToEnd();
        Console.WriteLine(result);
    }
}
catch (WebException e)
{
    Console.WriteLine(e.ToString());
}

如您所見,如果發生WebException,例如我收到403 Forbidden錯誤,則無法讀取內容。 我只是得到一個NullReferenceException。

因此,問題是:如果HttpWebRequest失敗,如何獲取WebResponse?

請檢查以下方法以獲取狀態碼。

     HttpWebResponse httpResponse = null;
    try
    {
        httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            string result = streamReader.ReadToEnd();
            Console.WriteLine(result);
        }
    }
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError)
    {
        var response = ex.Response as HttpWebResponse;
        if (response != null)
        {
            Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
        }
        else
        {
            // no http status code available
        }
    }
    else
    {
        // no http status code available
    }
}

您仍然可以使用WebException.Response屬性讀取響應內容:

HttpWebResponse httpResponse = null;
try
{
    httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        string result = streamReader.ReadToEnd();
        Console.WriteLine(result);
    }
}
catch (WebException e)
{
   Console.WriteLine(e.ToString());

   string responseText;
   using (var reader = new StreamReader(webException.Response.GetResponseStream()))
   {
       responseText = reader.ReadToEnd();
   }

   Console.WriteLine("WebException caught. Response text is {0}", responseText);
}

您可以嘗試這樣的事情:

        var response = e.Response as HttpWebResponse;
         if (response!=null && response.StatusCode != HttpStatusCode.OK)
        {
            Console.WriteLine("HTTP Error Code is: " + (int)response.StatusCode);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM