c# 捕获空 Json / 404 错误

c# catch empty Json / 404 error

我有以下代码用于访问 Api 其中 returns 和 Json 值。现在我可能尝试访问 api 但没有返回任何内容,也就是它试图搜索的给定 ID 不存在。这当然 returns 一个 404 但我不知道如何处理这个错误所以代码继续运行,现在它破坏了程序并崩溃了。

public RootObject GetApi(string url)
        {

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            try{
                WebResponse response = request.GetResponse();
                using (Stream responseStream = response.GetResponseStream()){
                    StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
                    var jsonReader = new JsonTextReader(reader);
                    var serializer = new JsonSerializer();
                    return serializer.Deserialize<RootObject>(jsonReader);
                }
            }

            catch (WebException ex){
                WebResponse errorResponse = ex.Response;
                using (Stream responseStream = errorResponse.GetResponseStream()){
                    StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
                    String errorText = reader.ReadToEnd();
                    // log errorText
                }
                throw;
            }
        }

这是给定api的Url的按钮点击事件。

 private void button1_Click(object sender, EventArgs e)
        {
            result_rTBox.Text = "";
            api_Handler api_Handler = new api_Handler();

            string spidyApi_itemSearch = "http://www.gw2spidy.com/api/v0.9/json/item-search/";
            string Gw2Api_allListings = "https://api.guildwars2.com/v2/commerce/listings/";


            string userInput_itemName = userSearchInput_tBox.Text;
            string spidyApi_searchIdByName = spidyApi_itemSearch + userInput_itemName;

            if (!string.IsNullOrWhiteSpace(userSearchInput_tBox.Text)){
                var spidyApi_searchIdByName_result = api_Handler.GetApi(spidyApi_searchIdByName);
                var Gw2Api_isItemIdinListing_result = api_Handler.GetApi(Gw2Api_allListings + spidyApi_searchIdByName_result.results[0].data_id);

                //result_rTBox.Text = Gw2Api_isItemIdinListing_result.results[0].data_id.ToString();
            }
}

首先,我使用字符串 "spidApi_itemSearch" 访问 api,然后我有 ID 需要检查 api Gw2Api_allListings 中是否存在。如果它不存在,这种情况经常发生,它 returns 什么都没有,并出现 404 错误。即使 returns 什么都没有,我如何让代码继续运行?

编辑:我现在拥有的代码仍然在中断时崩溃。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            try
            {
                var requesting = WebRequest.Create(url);
                using (var response = request.GetResponse())
                {
                    using (var responseStream = response.GetResponseStream())
                    {
                        StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
                        var jsonReader = new JsonTextReader(reader);
                        var serializer = new JsonSerializer();
                        return serializer.Deserialize<RootObject>(jsonReader);
                    }
                }
            }
            catch (WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError &&
                    ex.Response != null)
                {
                    var resp = (HttpWebResponse)ex.Response;
                    if (resp.StatusCode == HttpStatusCode.NotFound){

                    }

                }
                throw;
            }
        }

使用HttpStatusCode Enumeration,特别是HttpStatusCode.NotFound

尝试使用 HttpWebResponse

而不是 WebResponse
HttpWebResponse errorResponse = we.Response as HttpWebResponse;
if (errorResponse.StatusCode == HttpStatusCode.NotFound) {
  // handle the error here
}

我们在哪里 WebException