gpt4 book ai didi

c# - HttpWebRequest 正确的异常处理

转载 作者:行者123 更新时间:2023-11-30 12:46:47 25 4
gpt4 key购买 nike

所以我在 System.Net 程序集中使用 HttpWebRequest API,但是因为 C# 没有检查异常,所以我不确定将 try-catch block 放在哪里以正确处理不可避免的异常由网络错误等常见问题引起。您知道,在 Java 中,我们将这些普通的旧检查 IOExceptions 称为。

这是我到目前为止所拥有的。我的 try-catch block 是否正确设置以处理网络错误?我包装了正确的方法调用吗?查看文档,我认为他们是对的,但我需要第二双眼睛。

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

最佳答案

首先,除非出于某种原因需要使用 HttpWebRequest,否则最好使用 WebClient.UploadString 或 WebClient 的任何其他 >UploadXXX 用于上传名称/值对、文件、二进制数据等的重载。这对您来说会容易得多,并且更容易进行故障排除和调试。此外,另一个问题是您将 JSON 解析期间或 onResult 处理程序错误期间的异常视为网络错误。

以下是您可能想尝试使用 WebClient 的三个示例:同步版本、“旧式”异步版本和使用 async/的“新式”异步版本等待。所有三个版本还尝试修复我上面提到的异常处理问题。如果您不需要异步支持,那么第一个版本将是最简单的。

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

关于c# - HttpWebRequest 正确的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18753021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com