Web API 服务 - 如何在异步任务中使用“HttpContext.Current”

2023-11-26

我正在使用“Web Api 休息服务的 Postasync 方法:

public async Task<object> Post([FromBody]string data)
{
      object response = ExecuteServerLogics(data);

      return response;
}

上面的代码运行良好,但在一些客户的调用中,我们遇到了性能问题。

阅读这里的一些文章后,我注意到我们的 webApi 休息服务, 并没有真正异步地处理传入的网络请求, 因为我们忘记使用异步/等待模式 :

public async Task<object> Post([FromBody]string data)
{
      object response = await Task<object>.Run( () =>
      {
           return ExecuteServerLogics(data);
      });

      return response;
}

经过这次修复后,我们注意到性能得到了改善, 但我们发现了另一个批评者的问题: 当访问时HttpContext.Current- 它返回空引用:

public async Task<object> Post([FromBody]string data)
{
      object response = await Task<object>.Run( () =>
      {
           var currentContext = HttpContext.Current; // Returns Null!
           return ExecuteServerLogics(data);
      });

      return response;
}

我们试图找到一个解决方案,在大多数帖子中我们发现我们应该通过 工作线程的HttpContext引用执行服务器逻辑的内部任务。 该解决方案的问题在于服务器的逻辑方法使用许多静态类,这些静态类使用“HttpContext.Current”例如 -

  1. 记录员打电话。
  2. 检索 user.identity 的静态安全类
  3. 检索传入请求会话数据等的静态安全类。

因此,通过“HttpContext.Current”工作线程的引用无法解决它。

当我们尝试下一个解决方案时:

public async Task<object> Post([FromBody]string data)
    {
          // Save worker context:
          var currentContext = HttpContext.Current; 

          object response = await Task<object>.Run( () =>
          {
               // Set the context of the current task :
               HttpContext.Current = currentContext ; // Causes the calls not to work asynchronously for some reason!

               // Executes logics for current request:
               return ExecuteServerLogics(data);
          });

          return response;
    }

由于某种原因,我们注意到性能再次变差,就像它再次恢复同步工作一样。

我们的问题是:

1.为什么在最后一个例子中,设置“HttpContext.Current”在等待任务中, 导致请求返回相同的不良性能结果,类似于同步结果?

2.我们还有其他方法可以使用吗“HttpContext.Current”在调用“ExecuteServerLogics”的内部任务内, 以及所有也调用的静态类“HttpContext.Current”? 我整个设计是不是错了?

Thanks!


从一开始就:

public async Task<object> Post([FromBody]string data)
{
  object response = ExecuteServerLogics(data);
  return response;
}

不要忽略编译器警告;编译器将为该方法生成一个警告,明确指出它将同步运行。

继续:

在一些客户的通话中,我们遇到了性能问题。

服务器上的异步代码将not单独的单个调用速度更快。它只会帮助你scale你的服务器。

尤其,Task.Run将抵消所有的性能优势async然后稍微降低性能。我相信您测量到的性能改进纯属巧合。

在大多数帖子中,我们发现我们应该将工作线程的 HttpContext 引用传递到执行服务器逻辑的内部任务中。

这些帖子都是错误的。恕我直言。你最终会使用HttpContext来自后台线程的对象,当该对象专门设计为只能从请求线程访问时。

我整个设计是不是错了?

我确实建议您退后一步,考虑一下大局。当请求到来时,它有一定量的工作要做。该工作是同步完成还是异步完成对于客户端来说并不重要;两种方法将花费大约相同的时间。

如果您需要返回early对于客户来说,那么您将需要一个完全不同的架构。通常的方法是将工作排队到可靠的队列(例如 Azure 队列),拥有单独的后端(例如 Azure WebRole),并在工作完成时主动通知客户端(例如 SignalR)。

这并不是说async不过是没用的。如果ExecuteServerLogics是一个 I/O 绑定方法,那么它应该是异步的而不是阻塞的,然后你可以使用异步方法,如下所示:

public async Task<object> Post([FromBody]string data)
{
  object response = await ExecuteServerLogicsAsync(data);
  return response;
}

这将使您的服务器总体上更具响应性和可扩展性(即,不会被许多请求淹没)。

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

Web API 服务 - 如何在异步任务中使用“HttpContext.Current” 的相关文章

  • WCF 与 WebAPI 和本机移动设备

    我一直在开发一个完全基于 ajax 的单页 Web 应用程序 无 POST 现在我在开发过程中使用 ASMX 来提供 Web 服务 Web 服务使用 JSON 数据 对于该版本 我知道我需要升级到 WCF 或 WebAPI 最终 我计划构建
  • DropDownList 列表中的项目

    谁能告诉我在下拉列表中添加所有项目的最短方法List
  • 向 ASP.NET WebApi 2.2 添加身份验证

    我创建了一个 WebApi 2 2 项目 来自一个空的新 ASP NET 项目 来证明一些实现概念 现在我想向其中添加身份验证 我注意到在新的 WebApi 应用程序上添加身份验证的唯一方法是使用模板之一 在我的例子中是 VS 2013 是
  • 当我的 Login.aspx 不在应用程序的根目录中时,如何使用 ASP.NET 登录控件?

    我正在使用ASP NET 登录控件 http msdn microsoft com en us library ms178329 aspx and 表单验证 http msdn microsoft com en us library aa4
  • ASP.NET MVC 3 文件夹结构

    在了解了传统 ASP NET Webform 的背景后 我正在学习 MVC 框架 我正在开发一个典型的示例电子商务网站 该网站具有公共域 然后能够注册提供对安全会员区域的访问的服务 我有几个问题 在 ASP NET 中 私有成员页面通常与公
  • PowerShell,使用 Start-Job 和 Start-Process 测试异步任务的性能/效率

    我很想测试 PowerShell 中异步任务的性能 有用性Start ThreadJob Start Job and Start Process 我有一个包含大约 100 个 zip 文件的文件夹 因此进行了以下测试 New Item 00
  • 在 Windows 服务中调用 Web 服务

    我使用了一个简单的 Windows 服务来使一个方法在特定时间运行并且运行良好 接下来我已经尝试过 protected override void OnStart string args this WriteToFile Simple Se
  • 如何避免在 ASP.NET 代码隐藏中编写混乱的 JavaScript?

    我想知道在 ASP NET 中使用 Javascript 的最佳实践是什么 我不知道这是否是最佳实践 但我在代码隐藏中添加了 javascript 客户端事件 它工作正常 但这是最佳实践吗 例如 我有一个单选按钮控件 并在 Page Ini
  • 如何让BackgroundWorker返回一个对象

    我需要做RunWorkerAsync 返回一个List
  • 会员提供商使用还是不使用?

    我正在开发一个使用 Facebook 的网站 现在为了管理用户我想使用MembershipProvider并选择开发一个定制的会员提供商 我的问题是我的数据库架构与标准成员资格架构不匹配 并且提供的用于覆盖的函数采用与我预期不同的参数 例如
  • 我可以在 Orchard CMS 中使用我的 Ninject .NET 项目吗?

    我正在使用 Orchard CMS 创建一个网站 并且有一个用 Ninject 编写的外部 NET 项目 用于依赖注入 我想将其与 Orchard CMS 中的模块一起使用 我知道 Orchard 使用 Autofac 进行依赖注入 这给我
  • 预编译的 asp.net 网站中的 - 这重要吗?

    我正在 Visual Studio 2008 上使用 Web 部署项目部署一个预编译和全页面合并的网站 请注意 所有程序集和项目都已在发布模式下编译 我的所有页面都是在发布模式下预编译的 所以它们不会被重新编译 它们只会被运行时加载 在不需
  • 从基本控制器继承 LINQ-to-SQL 数据上下文

    我的基本控制器类 BaseController 由面向公众的控制器继承 用于使用 LINQ to SQL 访问请求之间的共享数据上下文 我是否可以通过将数据存储在中来以高效且安全的方式访问我的数据上下文HttpContext Current
  • ASP.NET 4.0 中的模拟 HttpRequest

    我见过很多类似的帖子 但没有一个能真正解决我的特殊情况 我正在 ASP NET 4 0 Web 应用程序 ASP NET Forms 而不是 MVC 中编写单元测试 代码中有几个地方我称之为ServerVariables调用变量的集合 例如
  • 为什么没有await 的异步函数会导致编译器警告?

    谁能解释为什么 c 5 中的异步函数需要至少 1 个等待 我找不到明确的原因 解释 我所说的必需 是指当异步函数内部没有任何等待调用时 编译器会发出警告 但不会引发编译错误 From 这个答案 https stackoverflow com
  • System.Linq.Dynamic 不支持 OrderByDescending("someColumn")?

    好的 在我们的项目中 我使用 System Linq Dynamic 库 但我刚刚注意到我无法执行以下操作 myDataSource OrderByDescending someColumnName 因为我收到以下错误 重载解析失败 因为无
  • 如何在perl中使用O_ASYNC和fcntl?

    我想使用 O ASYNC 选项 当管道可以读取时 SIGIO 的处理程序将运行 但以下代码不起作用 任何人都可以帮助我吗 bin env perl use Fcntl SIG IO sub print catch SIGIO n my fl
  • Asp.net core webapi获取从Angular4应用程序发布的空值

    我是新来的Angular4在快速交付内容的情况下 所以没有时间彻底学习它 所以如果我的问题看起来很幼稚 请原谅 From my Asp Net Web API I have Confirmemail API必须从 Angular4 应用程序
  • 会话变量由于某种原因丢失

    我尝试建立一个电子商店 每件物品旁边都有一个asp imagebutton单击此图像按钮时 我正在检查会话变量是否session basket 是否存在 如果不存在 则我将值添加到列表 实体类 中 然后在会话中添加此列表 如果会话不为空 那
  • 在 ServiceStack 中使用 ASP.NET 成员资格

    我该如何使用ASP NET 会员资格 in 服务栈 http www servicestack net ServiceStack OrmLite ServiceStack Host AspNet 等 您可以将 ServiceStack 托管

随机推荐

  • PHPUnit、PEAR 升级错误

    注 我读过关于这个问题的所有问题 PEAR 已在我的系统 Ubuntu 11 10 Apache 2 2 20 上安装和配置 因为 返回这个 bool true PEAR 手册 检查 PEAR 是否工作第 4 步 当我尝试使用 phpuni
  • 使用 JavaScript MV* 框架的原因? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我有一个电子商务网站 它需
  • 多核安卓

    我运行了简单的并行算法 绘制了 mandelbrot 集 以在 Nexus 7 Tegra 3 4 1 核心 上测试并行计算 运行几次后 串行速度为 1 5 秒 并行速度为 1 0 秒 但并行和串行速度非常接近 均为 1 3 秒 正方形是7
  • 创建共享 HSQLDB 数据库

    进程内 HSQLDB 数据库不应被其他人打开 即使对于基于文件的存储也是如此 文档暗示这是可能的 服务器模式 高级主题 但我还没有找到如何激活此行为的 URL 有没有人这样做过 以便分享如何做 以下对我有用 从您的代码启动服务器 如 HSQ
  • 防止元素的最后一个单词与另一个元素之间出现换行

    给定一个具有可变长度文本的内联 或内联块 元素 以及第一个元素右侧的另一个元素充当一种徽章 是否有一种方法可以防止第一个元素的最后一个单词之间出现换行符元素和第二个元素 两个元素占据同一行就可以了 第一个元素的文本中出现换行也可以 但两个元
  • 如何在 React Native 中使用 CSS

    我可以用吗CSS为我的造型反应本机成分 目前我只能使用样式表像这样 var styles React StyleSheet create autocomplete backgroundColor FFF zIndex 5 我想使用 CSS
  • 我可以使用链式比较运算符语法吗? [复制]

    这个问题在这里已经有答案了 在一个 JS 库中我看到这样的语法 if val gt 5 t 我在控制台中测试了这个 1 1 2 false 2 gt 1 1 true 1 2 1 false 1 1 1 true 1 lt 2 lt 3 t
  • TextView 字符串中的 HTML 标签

    如果我将简单的 HTML 格式标记 例如 放入字符串资源中并在 TextView 中显示该字符串 则会应用预期的格式 但是 如果我构建自己的字符串并显示它 我该如何做到这一点呢 如果我执行类似 String str This is bold
  • 摆脱 元素周围的填充/边距?

    我在 div 中有一个画布对象 画布周围似乎有某种填充物 我希望它的边缘接触浏览器屏幕的边缘 my html file div div my java gwt code Canvas canvas Canvas createIfSuppor
  • 如何在 Windows Phone 上运行并行任务?

    我正在构建一个 WP8 应用程序 需要执行大约 30 个网络请求 这些请求彼此不依赖 因此可以并行化 我的代码如下所示 简化 伪代码 foreach Uri uri in uris var rawData await Task Run gt
  • FullCalendar 结束日期不包括在内

    我正在使用 FullCalendar Beta2 并将 AllDay 标志设置为 True 日历仍然将结束日期视为排他日期 如何使结束日期包含在内 非常感谢 ZooZ 根据 Beta 2 升级文档 结束日期现在是唯一的 所有结束日期现在都是
  • Django loaddata - 内存不足

    我使用以下命令转储了我的数据库dumpdata它创建了一个 500mb 的 json 文件 现在我正在尝试使用loaddata恢复数据库 但似乎 Django 尝试在应用它之前将整个文件加载到内存中 并且我收到内存不足错误并且进程被终止 难
  • 如何制作这样一个带有渐变和透明的有角度的箭头?

    如何制作这样一个带有渐变和透明的有角度的箭头 我在这里做了一个带有渐变的块 需要帮助才能转换为箭头 http jsfiddle net jitendravyas aZ65c 2 我需要一个兼容ie8的兼容机 jitendar 看看我用纯CS
  • SQL 中外连接的目的(或用例)是什么?

    外连接仅用于开发人员的分析吗 我无法找到一个用例来解释为什么您想要在两个或多个不相关或不 匹配 您的选择条件的表中包含数据 一个示例用例是生成一个显示所有客户及其购买情况的报告 也就是说 甚至向未购买任何商品的顾客展示 如果您对客户和购买进
  • Rcpp - 在 sourceCpp 引用的文件中使用多个 C++ 函数?

    我希望这不是太明显 因为我已经搜索了一整天但找不到答案 假设我有以下 R 文件 library Rcpp sourceCpp cfile cpp giveOutput c 1 2 3 它编译以下 C 文件 include
  • 如何在 robolectric 中使用 findViewById()

    我只是想用 robolectric 测试某个视图在片段中是否可见 我的单元测试如下所示 ActivityController controller Robolectric buildActivity FragmentActivity cla
  • React Hook:将数据从子组件发送到父组件

    我正在寻找将数据从子组件传递到其父组件的最简单的解决方案 我听说过使用 Context 传递属性或更新 props 但我不知道哪一个是最好的解决方案 我正在构建一个管理界面 其中一个 PageComponent 包含一个带有表格的 Chil
  • RoutedUICommand PreviewExecuted 错误?

    我正在使用 MVVM 设计模式构建一个应用程序 并且我想使用 ApplicationCommands 类中定义的 RoutedUICommands 由于 View 的 CommandBindings 属性 读取 UserControl 不是
  • 检查 PHP 会话是否处于活动状态; [复制]

    这个问题在这里已经有答案了 基本上我想要实现的是这个 下面的方法不起作用 但你应该明白 if session status PHP SESSION ACTIVE show specific icons else don t show spe
  • Web API 服务 - 如何在异步任务中使用“HttpContext.Current”

    我正在使用 Web Api 休息服务的 Postasync 方法 public async Task Post FromBody string data object response ExecuteServerLogics data re