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);
}
}
}