HttpWebRequest правильная обработка исключений

Так что я использую HttpWebRequest API в сборке System.Net, но поскольку в C# нет проверенных исключений, я не уверен, куда поместить мои блоки try-catch для правильной обработки неизбежных исключений, вызванных общими вещами, такими как сетевая ошибка. Вы знаете, в Java мы бы назвали эти старые проверенные IOExceptions,

Это то, что я до сих пор. Правильно ли настроены мои блоки try-catch для обработки сетевых ошибок? Я упаковываю правильные вызовы методов? Глядя на документацию, я думаю, что они правы, но мне нужна вторая пара глаз.

HttpWebRequest request = WebRequest.CreateHttp(url);
request.Method = "POST";
request.BeginGetRequestStream(getRequestResult =>
            {
                HttpWebRequest getRequestRequest = (HttpWebRequest) getRequestResult.AsyncState;
                try
                {
                    Stream requestStream = getRequestRequest.EndGetRequestStream(getRequestResult);
                    requestStream.Write(parametersData, 0, parametersData.Length);
                    requestStream.Dispose();
                    getRequestRequest.BeginGetResponse(getResponseResult =>
                        {
                            HttpWebRequest getResponseRequest = (HttpWebRequest)getResponseResult.AsyncState;
                            try
                            {
                                WebResponse response = getResponseRequest.EndGetResponse(getRequestResult);
                                Stream responseStream = response.GetResponseStream();
                                StreamReader reader = new StreamReader(responseStream);
                                string jsonString = reader.ReadToEnd();
                                reader.Dispose();
                                JObject jsonObject = JObject.Parse(jsonString);
                                onResult(StatusCode.Ok, jsonObject);
                            }
                            catch (WebException)
                            {
                                onResult(StatusCode.NetworkError);
                            }
                        }, getRequestRequest);
                }
                catch (IOException)
                {
                    onResult(StatusCode.NetworkError);
                }
            }, request);

1 ответ

Во-первых, если нет какой-либо причины, которую вам нужно использовать HttpWebRequestтогда вам лучше использовать WebClient.UploadString вместо этого, или любой другой WebClient UploadXXX перегрузки для загрузки пар имя / значение, файлов, двоичных данных и т. д. Это будет намного проще для вас, а также для устранения неполадок и устранения неполадок. Кроме того, другая проблема заключается в том, что вы обрабатываете исключения во время синтаксического анализа JSON или ошибки обработчика onResult как сетевые ошибки.

Ниже приведены три примера использования WebClient, которые вы можете попробовать: синхронная версия, асинхронная версия "старого стиля" и асинхронная версия "нового стиля", которая использует async/await, Все три версии также пытаются исправить проблему обработки исключений, о которой я упоминал выше. Если вам не нужна асинхронная поддержка, то первая версия будет самой простой.

static void PostSync (string url, string parametersData)
{
    using (WebClient wc = new WebClient())
    {
        wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; // or "application/json" or ...
        try
        {
            string htmlResult = wc.UploadString(url, parametersData);  // or UploadValues, UploadFile, ... 
            JObject jsonObject = null;
            try
            {
                jsonObject = JObject.Parse(htmlResult);
            }
            catch (JsonException ex)
            {
                onResult(StatusCode.JsonError);
            }
            onResult(StatusCode.Ok, jsonObject);

        }
        catch (System.Net.WebException ex)
        {
            onResult(StatusCode.NetworkError);
        }
    }
}

static void PostAsync(string url, string parametersData)
{
    using (WebClient wc = new WebClient())
    {
        wc.UploadStringCompleted += (Object sender, UploadStringCompletedEventArgs e) =>
        {
            if (e.Error != null)
                onResult(StatusCode.NetworkError);
            JObject jsonObject = null;
            try
            {
                jsonObject = JObject.Parse(e.Result);
            }
            catch (JsonException ex)
            {
                onResult(StatusCode.JsonError);
            }
            onResult(StatusCode.Ok, jsonObject);
        };
        try
        {
            wc.UploadStringAsync(new Uri(url, UriKind.Absolute), parametersData);
        }
        catch (System.Net.WebException ex)
        {
            onResult(StatusCode.NetworkError);
        }
    }
}

static async void PostTaskAsync(string url, string parametersData)
{
    using (WebClient wc = new WebClient())
    {
        wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; // or "application/json" or ...
        try
        {
            string htmlResult = await wc.UploadStringTaskAsync(url, parametersData);  // or UploadValues, UploadFile, ... 
            JObject jsonObject = null;
            try
            {
                jsonObject = JObject.Parse(htmlResult);
            }
            catch (JsonException ex)
            {
                onResult(StatusCode.JsonError);
            }
            onResult(StatusCode.Ok, jsonObject);

        }
        catch (System.Net.WebException ex)
        {
            onResult(StatusCode.NetworkError);
        }
    }
}
Другие вопросы по тегам