RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1410825
Accepted
Liana
Liana
Asked:2022-07-17 19:39:52 +0000 UTC2022-07-17 19:39:52 +0000 UTC 2022-07-17 19:39:52 +0000 UTC

C# .NET4 如何验证 POST 请求的本地错误?

  • 772

目标如下,发送请求并接收数据(我们省略接收数据)

如果计算机上没有 Internet,则显示有关此的错误

如果互联网可用但很弱,则获取超时并显示它

这个想法很简单...

namespace WebClientTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            HttpWebRequest httpWebRequest;
            HttpWebResponse httpResponse = null;

            try
            {
                httpWebRequest = (HttpWebRequest)WebRequest.Create("http://8.8.8.8/");

                httpWebRequest.Method = "POST";
                httpWebRequest.Timeout = 30000;
                httpWebRequest.ContinueTimeout = 10000;
                try
                {
                    httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                }
                catch (WebException ex)
                {
                    Console.WriteLine("WebException: " + ex.Status.ToString());
                    Console.WriteLine("WebException: " + ex.Message);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception: " + ex.Message);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }
    }
}

我关闭了网络适配器,20 秒后出现 WebException 问题:

WebException:连接失败

WebException:无法连接到远程服务器如果我将速度限制在最低限度,我会得到相同的结果

来自这里的问题

当超时时间长达 30 秒时,为什么在 20 秒后发生 ConnectFailure?

如果速度仅限于 64kb 及以下,为什么还要使用 ConnectFailure?根据想法应该有一个超时

是否甚至可以在不求助于第三方库并 ping 同一个 Google 的情况下区分没有 Internet 和连接不良?

PS 如果你指定的超时时间小于 20 秒,那么正好在两种情况下,没有互联网或连接不良

最后,我想看看:

如果没有互联网连接失败

互联网超时有限

c# .net
  • 1 1 个回答
  • 31 Views

1 个回答

  • Voted
  1. Best Answer
    aepot
    2022-07-18T01:50:19Z2022-07-18T01:50:19Z

    HttpWebRequest已经如此古老,以至于它早已死亡、埋葬和腐烂。把它埋回去,重新开始。您对过时且有轻微故障的客户端的问题没有多大意义,因为它本身已经无关紧要。

    从 .NET Framework 4.5 开始,您应该使用现代HttpClient 进行网络连接。虽然我给你的建议是,如果你真的需要一个古老的框架,那么就不要使用 4.6 之前的版本,老版本与互联网不兼容,为了让它们工作,你必须拄拐杖,但它是最好使用 4.7.2 和更新版本。

    POST请求必须包含一个body,也就是内容,需要写的代码很大程度上取决于这个内容的类型,但是这里给你留个空白。让它成为一些要发送的文本,比如 JSON。

    static readonly HttpClient client = new HttpClient();
    
    static async Task Main(string[] args)
    {
        string json = "{ \"message\": \"Hello World\" }";
        string url = "https://my.host";
        try
        {
            using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url))
            {
                request.Content = new StringContent(json, "application/json", Encoding.UTF8);
                using (HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
                {
                    Console.WriteLine($"{(int)response.StatusCode} {response.ReasonPhrase}");
                    response.EnsureSuccessStatusCode();
                    string result = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(result);
                }
            }
        }
        catch (HttpRequestException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    

    (几乎不记得它是如何用旧的 C# 7.x 编写的)

    并且不要为超时而烦恼。首先,熟悉工作模式下的工具。好吧,学习异步编程。

    顺便说一句,.NET 4.x 也已经过时了。另一个有用的效果是,如果你切换到现代 dotnet,它HttpClient会突然开始支持 HTTP/2 和其他现代好东西,而且运行速度会更快。从 .NET Core 3.1 开始,它有一个从头开始重写的新网络引擎。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5