异步 HttpModule MVC

2023-11-25

我有一个包含以下代码的同步 HttpModule。

    /// <summary>
    /// Occurs as the first event in the HTTP pipeline chain of execution 
    /// when ASP.NET responds to a request.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">An <see cref="T:System.EventArgs">EventArgs</see> that 
    /// contains the event data.</param>
    private async void ContextBeginRequest(object sender, EventArgs e)
    {
        HttpContext context = ((HttpApplication)sender).Context;
        await this.ProcessImageAsync(context);
    }

当我尝试从空的 MVC4 应用程序 (NET 4.5) 运行该模块时,出现以下错误。

此时无法启动异步操作。异步 操作只能在异步处理程序中启动,或者 模块或页面生命周期中的某些事件期间。如果这 执行Page时发生异常,请确保该Page是 标记为 。

我似乎遗漏了一些东西,但根据我的阅读,该错误实际上不应该发生。

我已经进行了挖掘,但似乎找不到任何帮助,有人有任何想法吗?


因此,同步 HttpModule 事件处理程序中有异步代码,并且 ASP.NET 会引发异常,指示异步操作只能在异步处理程序/模块内启动。对我来说似乎很简单。

要解决此问题,您不应订阅BeginRequest直接地;相反,创建一个Task-返回“处理程序”,将其包装起来EventHandlerTaskAsyncHelper,并将其传递给AddOnBeginRequestAsync.

像这样的东西:

private async Task ContextBeginRequest(object sender, EventArgs e)
{
  HttpContext context = ((HttpApplication)sender).Context;
  await ProcessImageAsync(context);

  // Side note; if all you're doing is awaiting a single task at the end of an async method,
  //  then you can just remove the "async" and replace "await" with "return".
}

并订阅:

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

异步 HttpModule MVC 的相关文章

随机推荐

  • TFS Build 找不到 Grunt

    我已经在 TFS 构建服务器上安装了 npm 和 grunt 我使用安装了 grunt clinpm 安装 g grunt cli然后就可以运行了咕噜部署以我自己身份登录时从命令行 Out TFS 构建运行为tfs服务尽管用户 并且当它尝试
  • ZendDeveloperTools 模块在 ZF2 beta5 中不显示工具栏

    我正在尝试安装ZendDeveloperTools模块用于ZF2测试版5 以下是我到目前为止所遵循的步骤 安装成功ZendSkeletonApplication 将模块下载到我的 vendor目录 启用该模块 config applicat
  • 如何在 MySQL 中将 BLOB 转换为 TEXT?

    我有大量记录 其中文本存储在 MySQL 的 blob 中 为了便于处理 我想将数据库中的格式更改为文本 有什么想法可以轻松地进行更改以免中断数据 我想它需要正确编码 那是不必要的 只需使用SELECT CONVERT column USI
  • “删除”-恢复本机功能不适用于更改后的原型,那么怎么办?

    如果你像这样改变本机函数 window open function a b c alert 2 然后你就可以 delete window open 它会恢复原来的功能 但是 如果你像这样改变它的原型 window proto open fu
  • 从 WCF 请求中删除 ActivityId

    我在 WCF 客户端和 Java Web 服务之间遇到了一个有趣的兼容性问题 简而言之 我发现标头的生成方式导致了问题 标头中的 ActivityId 和 Action 元素以及 WCF 对自定义标头的命名空间所做的操作导致了问题 我已成功
  • 在 Android Espresso 测试中关闭警报对话框

    我已经四处寻找解决方案 但找不到 我正在创建一个 Espresso 测试 需要关闭第一次显示特定活动屏幕时出现在屏幕中间的警报对话框 对话框上没有按钮 因此用户需要单击框外的任意位置才能将其关闭 有谁知道我如何用浓缩咖啡做到这一点 我尝试单
  • 在通过电子邮件发送 WhatsApp 聊天时,如何使我的 Android 应用程序出现在应用程序选择器中?

    我有兴趣让我的应用程序出现在我使用 WhatsApp 中的 电子邮件对话 功能时显示的应用程序列表中 当使用 电子邮件对话 WhatsApp 功能登录手机时 我可以看到SEND MULTIPLEGmail 收到的意图 I ActivityM
  • JS 文件中的 PHP 常量

    我面临着一个我无法理解的问题 在插件开发过程中 我包含了一个 file js php 注册 排队 Begin Tests var templateDir
  • 将选择下拉箭头替换为 fa-icon

    我试图用 fa 图标 chevron circle down 替换选择下拉箭头 但我只能发现背景可以用 css 文件中的图像替换 我可以在选择上添加图标 但是它不可点击 如何在选择下拉列表中使用字体图标有任何帮助吗 因为你不能使用pseud
  • CTRL+C 忽略 Webbrick 服务器

    In the past I could exit my rails application launched using webbrick using CtrlC At some point in development this func
  • 检查PHP是否已编译--with-mysql [重复]

    这个问题在这里已经有答案了 可能的重复 检测php中的mysql支持 有没有一种快速的方法来以编程方式检查这个特定的 PHP 安装是否已编译为支持 MYSQL 实际上有多个支持 MySQL 的模块 mysql mysqli pdo mysq
  • Spring Boot如何使用jwt进行用户角色管理

    我正在用 spring boot 编写一个 RESTful api 我正在使用 spring boot jersey mongo db swagger spring boot security 和 jwt 我已经编写了模型 数据库请求的存储
  • Android 上的 Web 视图支持 SSL 吗?

    The WebViewandroid 上的控件 支持 SSL 吗 我正在尝试加载一个使用受信任 ssl 证书的网页 但是WebView只是白色的 有什么建议么 不是专家 只是我在网上找到的 据我了解 WebView确实支持ssl 但是 黑屏
  • NPM 不工作(找不到模块“internal/fs”-nodejs)

    更新时出现 NPM 错误 我最近更新到 Node 版本 7 x 现在 npm 不工作了 我无法定位错误 可能是由于 npm ERR Cannot find module internal fs 当我跑步时我得到以下信息sudo npm up
  • 使用 unique_ptr 进行前向声明[重复]

    这个问题在这里已经有答案了 我发现将类的前向声明与std unique ptr如下面的代码所示 它可以使用 GCC 进行编译和工作 但整个事情看起来有点奇怪 我想知道这是否是标准行为 即标准所要求的 由于当我声明时 B 不是完整类型uniq
  • Android使用支持库来支持SearchView

    这是我的代码 if Build VERSION SDK INT gt Build VERSION CODES HONEYCOMB MenuItem searchItem menu findItem R id searchMenuItem S
  • @WebServlet 注释 web.xml 欢迎文件

    我想设置 JSP JavaBeans 项目的欢迎文件 我有一个名为 Controller java 的 servlet 带有以下 WebServlet 注释 WebServlet name Controller urlPatterns lo
  • SetValue 64位机器注册表

    我想在下面的注册表路径中设置 NoModify 的值 HKEY LOCAL MACHINE SOFTWARE Microsoft Windows CurrentVersion Uninstall XXXX 我使用下面的代码 它仅适用于 X8
  • Android Studio 与 Google Play:缺少 Google Play 服务

    我使用的是 Ubuntu 14 Android Studio 0 8 6 我正在使用 Genymotion 运行应用程序 我得到的响应是 W GooglePlayServicesUtil Google Play services is mi
  • 异步 HttpModule MVC

    我有一个包含以下代码的同步 HttpModule