.Net Core中间件-从请求中获取表单数据

2023-11-26

在 .NET Core Web 应用程序中,我使用中间件 (app.UseMyMiddleware) 在每个请求上添加一些日志记录:

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler(MyMiddleware.GenericExceptionHandler);
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseMyMiddleware();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
        public static void UseMyMiddleware(this IApplicationBuilder app)
        {
            app.Use(async (context, next) =>
            {
                await Task.Run(() => HitDetails.StoreHitDetails(context));
                await next.Invoke();
            });
        }
        public static void StoreHitDetails(HttpContext context)
        {
            var config = (IConfiguration)context.RequestServices.GetService(typeof(IConfiguration));
            var settings = new Settings(config);
            var connectionString = config.GetConnectionString("Common");
            var features = context.Features.Get<IHttpRequestFeature>();
            var url = $"{features.Scheme}://{context.Request.Host.Value}{features.RawTarget}";

            var parameters = new
            {
                SYSTEM_CODE = settings.SystemName,
                REMOTE_HOST = context.Connection.RemoteIpAddress.ToString(),
                HTTP_REFERER = context.Request.Headers["Referer"].ToString(),
                HTTP_URL = url,
                LOCAL_ADDR = context.Connection.LocalIpAddress.ToString(),
                AUTH_USER = context.User.Identity.Name
            };

            using (IDbConnection db = new SqlConnection(connectionString))
            {
                db.Query("StoreHitDetails", parameters, commandType: CommandType.StoredProcedure);
            }
        }

这一切都工作正常,我可以从请求中获取我需要的大部分内容,但接下来我需要的是 POST 方法上的表单数据。

context.Request.Form 是一个可用选项,但在调试时我将鼠标悬停在它上面并看到“函数评估需要所有线程运行”。如果我尝试使用它,应用程序就会挂起。

我需要做什么才能访问 Request.Form 或者是否有我没有看到的带有 POST 数据的替代属性?


您可以创建一个单独的中间件而不是内联中间件,然后调用HitDetails.StoreHitDetails从那里。

public class MyMiddleware
{
    private readonly RequestDelegate _next;

    public MyMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        HitDetails.StoreHitDetails(context);

        await _next(context);
    }
}

// Extension method used to add the middleware to the HTTP request pipeline.
public static class MiddlewareExtensions
{
    public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<MyMiddleware>();
    }
}

这样你就可以继续使用app.UseMyMiddleware();并且您不必使用来运行它Task.Run正如你提到的。

或者您可以尝试致电HitDetails.StoreHitDetails(context)不把它包裹起来Task.Run

Edited

检查您的Request具有正确的内容类型:

if (context.Request.HasFormContentType)
{
    IFormCollection form;
    form = context.Request.Form; // sync
    // Or
    form = await context.Request.ReadFormAsync(); // async

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

.Net Core中间件-从请求中获取表单数据 的相关文章

  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • Shell 脚本:从 shell 脚本中执行 python 程序

    我尝试用谷歌搜索答案 但没有运气 我需要使用我的作品超级计算机服务器 但为了运行我的 python 脚本 它必须通过 shell 脚本执行 例如我想要job sh执行python script py 如何才能做到这一点 只需确保 pytho
  • 使用 Moq 模拟惰性接口

    我想要模拟惰性接口 但我得到了object reference not set to an instance of an object例外 这是正在测试的类 public class ProductServiceService IProdu
  • 无法使用 rbenv 在 OSX 10.10 GM 3.0 上构建 Ruby 2.1.3

    我发现其他用户也遇到过类似问题的几个线程 但似乎没有一个是这样的 发出命令后 rbenv install 2 1 3 我收到以下错误 Installing ruby 2 1 3 BUILD FAILED OS X 10 10 using r
  • 为什么 AntiForgeryToken 隐藏字段与我机器上的 cookie 不同?

    我刚刚通过修改默认登录表单 使用简单的 ASP NET MVC 3 示例进行了快速测试 根据本文 都是隐藏域 RequestVerificationToken和饼干 RequestVerificationToken Lw 必须包含与生成的值
  • SQL Server:以编程方式执行维护计划

    有没有办法以编程方式执行 启动 SQL Server 维护计划 我们有一个每晚运行并使用大量数据更新数据库的 Windows 服务 一旦完成 我们希望触发数据库中的维护计划以开始运行 您可以通过以下方式开始一项属于维护计划一部分的工作sp
  • 首先使用 Entity Framework 4 代码在 DbContext.DbSet 中实现 InsertOnSubmit 等效项

    我正在使用实体框架代码优先方法 并且正在构建提供数据访问的通用存储库类 在这堂课上我想要一个Add T entity 方法 然而 没有InsertOnSubmit方法作为DbSet
  • 如何在运行时动态加载 ASP.NET Core Razor 视图

    是否可以在运行时从单独的程序集中引用 ASP NET Core Razor 视图 我知道如何使用动态加载控制器IActionDescriptorChangeProvider但找不到查看视图的方法 我想创建一个简单的插件系统并管理插件而无需重
  • Istio - 使用 URI 正则表达式匹配进行 URI 重写

    对 Istio 比较陌生 有一个关于 Istio 的问题 假设我想根据路径重写 URI 但在重写中使用原始 URI 的一部分 这是我可以使用 Regex 做的事情吗 我正在想象这样的事情 http match uri regex s can
  • 是否可以使用 .NET DeflateStream 创建 pdf?

    我正在尝试通过 C 代码创建 pdf 文件的功能 我一直在研究 PDF 规范 并能够创建一个工作 PDF 文件 方法是获取数据字符串并使用 UTF8 编码将它们编码为字节数组 我遇到的问题是当我尝试使用DeflateStream在 pdf
  • 如何重置行名称?

    这是一个示例数据集 sample1 lt data frame Names letters 1 10 Values sample seq 0 1 1 0 1 当我对数据集重新排序时 我丢失了行名称顺序 sample1 order sampl
  • 地图元素合适的 WAI-ARIA 角色属性是什么

    在我的网页中 我有一半是使用谷歌地图的地图显示 什么aria role我应该补充一下吗canvas显示地图的元素 我看过WAI ARIA 文档对于可能的角色定义 我发现的最接近的是widget 什么是合适的aria role页面上有地图吗
  • EC2 Linux 计算机上安装的 OpenJDK 8 不支持 ECDHE 密码套件

    启动时jetty distribution 9 3 0 v20150612 with openjdk 1 8 0 51在 EC2 Amazon Linux 计算机上运行时 打印出所有配置的 ECDHE 套件均不受支持 2015 08 12
  • (.net) CriticalFinalizerObject - 它到底有什么作用?

    我对这个类的理解是 当您想确保调用该类的终结器 析构函数 时应该使用它 但从我所做的一些测试来看 这似乎并不正确 如果它不能确保调用 dispose 方法 是否还有其他方法可以做到这一点 例如 如果我想确保运行某些代码来结束我的对象 即使我
  • ANSI C 联合 - 它们真的有用吗?

    从昨天对某个问题的回答中 我了解到 假设成员的底层对齐 写入一个联合成员并从另一个不同类型的成员读取值是不可移植且不安全的 因此 经过一些研究 我找到了一个书面来源 它重复了这一主张并指定了一个流行的示例 使用 int 和 float 的联
  • 如果 ngSrc 路径解析为 404,是否有办法回退到默认值?

    我正在构建的应用程序要求我的用户在加载此图像之前设置 4 条信息 该图像是应用程序的核心部分 因此损坏的图像链接使整个事情看起来像是被破坏了 我想要另一个图像代替 404 上的位置 有任何想法吗 我想避免为此编写自定义指令 我很惊讶我找不到
  • 在 iPhone Simulator 4.3/XCode 4.2 和 4.0.2 中使用 Blocks 会导致应用程序崩溃

    还有其他人在 XCode 4 2 lion 或 4 0 2 中使用 4 3 iPhone 模拟器时遇到问题吗 我的代码已经长期运行 测试并在生产中使用块来指定完成操作 例如 我使用 UIView animate 淡出标签顶部的一些文本 如下
  • 关于如何在 python 中使用属性功能的真实示例?

    我对如何使用感兴趣 property在Python中 我已经阅读了 python 文档 在我看来 其中的示例只是一个玩具代码 class C object def init self self x None property def x s
  • int.from_bytes() 是如何计算的?

    我试图理解什么from bytes 事实上确实如此 The 文档提到了这一点 byteorder 参数确定用于表示整数的字节顺序 如果字节顺序为 big 则最高有效字节位于字节数组的开头 如果字节顺序为 little 则最高有效字节位于字节
  • 使用 TypeScript 样式化组件的 'css' 属性

    styled components有一个插件可以实现以下功能 div props theme colors text gt 有什么办法可以告诉 TypeScriptcss是所有元素上的有效属性吗 将以下行添加到项目内的 TypeScript
  • .Net Core中间件-从请求中获取表单数据

    在 NET Core Web 应用程序中 我使用中间件 app UseMyMiddleware 在每个请求上添加一些日志记录 public void Configure IApplicationBuilder app IHostingEnv