【发布时间】:2019-09-27 00:52:56
【问题描述】:
在 .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 数据?
【问题讨论】:
-
这可能是因为您正在使用
Task.Run,它将在线程池上运行您的StoreHitDetails,这就是为什么当您将鼠标悬停在Request.Form上时会看到该消息。为什么不将StoreHitDetails中的所有逻辑移至UseMyMiddleware?或者在await Task.Run(() => HitDetails.StoreHitDetails(context));完成后尝试使用Request.Form。我希望这会有所帮助。 -
啊哈当然!不幸的是,我无法移动 StoreHitDetails 逻辑,因为它在其他地方被重用。这个中间件不必在线程池中,它只是我可以让所有东西(bar Form)工作的唯一方法。知道如何在没有 async/await 调用的情况下编写它吗?谢谢,
标签: c# asp.net-core asp.net-core-middleware