【问题标题】:HttpWebRequest proper exception handlingHttpWebRequest 正确的异常处理
【发布时间】:2023-03-07 09:39:01
【问题描述】:

所以我在 System.Net 程序集中使用了HttpWebRequest API,但由于 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);

【问题讨论】:

  • 对我来说看起来是正确的,至少在异常处理方面。不过,附带说明一下,无论何时输入单词 Dispose,都应始终使用 using。所以你应该在responseStreamreader上做一个using,而不是手动调用Dispose()
  • 我知道using 声明,但我决定暂时跳过它,因为这里已经有足够的左括号和右括号了。使用Dispose() 而不是using 语句是否有某种风险?
  • using 打开自己的范围,并且只有在这个范围内相应的变量才有效。如果您手动调用Dispose,则没有什么能阻止您以后使用该变量。所以简而言之,正确使用,初始化你的变量,然后在它上面调用Dispose,然后再也不使用它就像using一样好。但是,using 允许人为错误的余地较小。
  • 明白了。感谢您的提示。

标签: c# httpwebrequest ioexception checked-exceptions


【解决方案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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2013-07-24
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多