是否应该在 using 语句中使用 WebClient?

2024-03-10

如果 HttpClient 不应该用于using声明,请参阅以下链接:https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ http://www.nimaara.com/2016/11/01/beware-of-the-net-httpclient/ http://www.nimaara.com/2016/11/01/beware-of-the-net-httpclient/

因此,如果您不应该在 using 语句中使用 HttpClient 那么为什么那么多示例将 WebClient 放在 using 语句中(包括 Microsoft);我还没有看到一篇关于不将 WebClient 放入using陈述?最终,在最低级别,WebClient 和 HttpClient 在同一位置打开 TCP/IP 套接字。是否是中间的原因使得 WebClient 可以接受放入using陈述?

注意我问这个问题是有原因的:我有一个在 WinXP、Win7 完整版和嵌入式系统上运行的客户端应用程序,我用来将 XML 发布到后端主机(CentOS 系统)的代码如下所示:

void PostXml(string url, string xml, int id) {
    try
    {
        //Console.WriteLine("POST Request: " + xml);
        using (WebClient wc = new WebClient())
        {
            wc.Proxy = null;    //DEBUG: testing this to see if it helps webclient post failure after time x
            wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
            Byte[] d = Encoding.ASCII.GetBytes(xml);

            //however Async below is better regardless for closing app and non interference with GUI
            //Byte[] res = web.UploadData(url, "POST", d);  //sychrounous will block until sent and response returned

            wc.UploadDataCompleted += new UploadDataCompletedEventHandler(web_UploadDataCompleted);
            wc.UploadDataAsync(new Uri(url), "POST", d, id);
        }
    }
    catch (WebException ex)
    {
        string responseText = "";
        using (var reader = new StreamReader(ex.Response.GetResponseStream()))
        {
            responseText = reader.ReadToEnd();
        }
        string logMsg = DateTime.Now.ToString("s") + " - PostXml WebClient webexception: " + ex.Message + "\r\n" +
            "  response: " + responseText + "\r\n\r\n";
        File.AppendAllText(SPUClient.frmMain._logFile, logMsg);
    }
    catch (Exception ex) {
        //Console.WriteLine("PostXml Exception: " + ex.Message);
        string logMsg = DateTime.Now.ToString("s") + " - PostXml exception: " + ex.Message + "\r\n";
        File.AppendAllText(SPUClient.frmMain._logFile, logMsg);
    }
}

PostXml 每 1 分钟被调用 2 次,我在该领域有 400 个客户端运行上面的代码,其中一些已经运行了一年多没有错误。但是我们有一些客户端在运行几周或几个月后运行此代码,显然只是停止执行 UploadDataAsync("POST")?目前我们所知道的是我们没有遇到异常,POST 消息不会离开计算机,并且在我的 CentOS 日志文件中我可以看到它从未到达(CentOS 上的 domain.net.access.log 显示了所有来自我所有客户的 POST 连接)。请记住,这种情况很少发生,有些客户端从未失败过,有些客户端在这种情况发生之前运行了数月/数周。重新启动客户端应用程序当然可以解决问题。我应该在 using 语句中使用 WebClient 这可能是导致此问题的原因还是其他原因?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否应该在 using 语句中使用 WebClient? 的相关文章

  • 实体框架一对多关系

    我的 EF 查询大约需要 3 秒才能获取 10 个玩家 因为它获取另一个表的所有 500k 行 而不是我需要的少数行 这是玩家实体 namespace RocketLeagueStats Database Entities Table pl
  • ASP MVC4 - 通过视图模型传递列表以查看

    我有一个模型人物 其中包括出生日期等字段 我想将所有人的列表以及每个人的计算年龄传递给视图 因此 视图模型 public class vm PersonList public Person Person get set public int
  • 从文本文件中读取所有内容 - C

    我正在尝试从文本文件中读取所有内容 这是我写的代码 include
  • float.Parse 不再在 Unity 中工作 (C#)

    我有一个包含以下代码行的工作项目 public InputField mass float val float Parse mass text 非常简单 用户输入一定量的质量 然后将其从文本解析为浮动 几天前这工作得很好 我什至能够多次导出
  • 如何使构造函数只能由基类访问?

    如果我想要一个只能从子类访问的构造函数 我可以使用protected构造函数中的关键字 现在我想要相反的 我的子类应该有一个构造函数 该构造函数可以由其基类访问 但不能从任何其他类访问 这可能吗 这是我当前的代码 问题是子类有一个公共构造函
  • ASP.NET Core 测试 - 没有方法 'public static IHostBuilder CreateHostBuilder(string[] args)

    我正在尝试在测试中设置我的应用程序并在中使用Startup s Configure method context Database EnsureCreated 并期待着Sqlite文件出现在Test sbin文件夹 这是我的代码 using
  • C - '=' 标记之前的预期表达式...在没有 '=' 的行上

    我疯狂地试图找出这个与现实 我的代码没有明显联系的错误消息 我一直在这里搜索并得出一个结论 你会讨厌 typedef 隐藏的指针 抱歉 这超出了我的控制范围 教授以这种方式提供了代码 我正在编辑问题中指定的代码 我弹出完整节点以避免每个推送
  • 使用工作表作为数据源的 VSTO Excel 的简单示例

    我想我遇到了 最简单的答案是最难找到的答案 的情况 而且我还没有遇到过任何搜索能够以直接的方式给我这个答案 这是为了Excel 2010 and VS 2010在现有 VSTO C 项目中 我有一个 Excel 工作表 其中包含 4 列数据
  • 如何测试 PARTIAL 视图在 C# ASP .NET MVC 中呈现

    我有一个视图 它内部有部分视图渲染 div class partialViewDiv Html RenderPartial partial Model SomeModelProperty div 和一个返回此视图的控制器 public Ac
  • Python NET 调用具有返回值和输出参数的 C# 方法

    我有以下静态 C 方法 public static bool TryParse string s out double result 我想使用 Python NET 包从 Python 调用它 import clr from System
  • 一个阻塞但非模态的 QDialog?

    我有一堆图像 我想对其执行一些操作 处理完每个图像后 我的程序应该弹出一个对话框 提示用户是否要继续处理下一个图像或中止 在此之前 他们应该有机会对图像或参数进行一些手动更改 无论如何 他们必须能够访问应用程序的窗口 而调用对话框的方法的执
  • 如何找到 QDockWidget 标题栏的高度?

    我正在尝试找到 a 的高度QDockWidget标题栏 以便对自定义布局进行一些智能调整大小 但标题栏不是单独的小部件 它内置于停靠小部件的私有布局中 并且没有成员可以访问它 还有其他方法可以找到它的高度吗 是的 您可以使用以下命令找到标题
  • .NET 查询字符串值的正则表达式

    我需要从 Url PathAndQuery 中删除任何 id SomeValue 其中 SomeValue 可以是整数或字符串 它后面可能有也可能没有另一个 符号 所以它可能是 somepage aspx cat 22 id SomeId
  • 如何为用户提供给定 boost::spirit 语法的自动完成建议?

    我正在使用 Boost Spirit 在我的 C GUI 应用程序中为非技术用户构建简单的 数据过滤器 语言 语言与纯英语非常相似 并且可以解析为 AST 我被要求使该过程尽可能对用户友好 因此我希望提供类似 CLang 的错误消息 无法识
  • .NET 配置(app.config/web.config/settings.settings)

    我有一个 NET 应用程序 它具有用于调试和发布版本的不同配置文件 例如 调试 app config 文件指向开发SQL服务器 http en wikipedia org wiki Microsoft SQL Server它启用了调试并且发
  • 自定义编译器警告

    在 Net 中使用 ObsoleteAtribute 时 它 会向您发出编译器警告 告诉您该对象 方法 属性已过时 应使用其他内容 我目前正在从事一个需要大量重构前员工代码的项目 我想编写一个自定义属性 可用于标记方法或属性 这些方法或属性
  • C# - 使用 Linq 获取 Attribute 的属性

    我有一个属性 它本身就有属性 我想访问这些属性之一 布尔值 并检查它是否正确 我能够检查属性是否已设置 但这就是全部 至少对于 linq 来说是这样 属性 public class ImportParameter System Attrib
  • 在 Qt C++ 中使用多个键

    我正在构建 坦克 游戏 我使用关键事件在地图上运行我的坦克 实际上我当时只能使用一把钥匙 但我需要有能力去完成任务 同时向上和离开 这是我的单键事件代码 switch event gt key case Qt Key Up if ui gt
  • 从原始 URL 获取重定向 URL

    我的数据库中有一个表 其中包含一些网站的 URL 我必须打开这些 URL 并验证这些页面上的一些链接 问题是某些 URL 被重定向到其他 URL 对于这样的 URL 我的逻辑是失败的 有什么方法可以传递原始 URL 字符串并获取重定向的 U
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调

随机推荐