我们在AcquireRequestState中花了相当多的时间来获取大量的ajax调用,在我们的旅行中我们偶然发现ASP.Net中的会话锁定gem,因此我们实现了一个自定义会话状态处理程序(基于下面的链接).
在进行更改并部署之后,我们看到AcquireRequestState急剧下降,但它已被PreExecuteRequestHandler取代.
今天早上我突然意识到我们已经包含了OWIN,这可能是PreExecuteRequestHandler占用这么多时间的原因.然后我继续删除它,当我部署代码时,PreExecuteRequestHandler从列表中消失.可悲的是,现在它已经以相同的成本再次被AcquireRequestState取代.
我们似乎在AJAX调用上非常努力地返回部分视图,AJAX调用返回原始类型或JSON对象似乎在很大程度上不受影响,尽管吞吐量更高.
所以这给我留下了3个问题,我绝对难以理解,我认为一个问题的答案会引导我们找到另外两个问题的答案.
1)为什么在安装OWIN时,成本从AcquireRequestState移动到PreExecuteEventHandler?OWIN上的东西标记为IRequireSessionState吗?(据我所知,AcquireRequestState应该在托管管道的早期发生)
2)我们如何获得有关AcquireRequestState内部实际内容的更多信息?或者我们花时间更好地返回JSON对象并使用它来呈现我们在UI上所需的内容?
3)我们确实看到一些请求(很少但是)在New Relic中映射到/ {controller}/{action}/{id},然后在上面提到的请求期间完全停留.尽管我们的路由设置限制只能路由到我们在项目中的控制器和操作.
PS:这看起来与以下内容非常相似,我们也在New Relic中看到了这一点:AcquireRequestState中的长时间延迟
自定义会话模块来自: 我刚刚发现为什么所有ASP.Net网站都很慢,我正在尝试解决该怎么做
考虑到我有 HTTP 动词、路由、标头和正文有效负载,是否有一种方法可以从我自己的应用程序中以编程方式调用 ASP.NET Core 请求管道?
在某些用例中,我们的 ASP.NET Core 应用程序的 WebAPI 无法访问,因为该应用程序在防火墙后面运行或无法访问。
为了为这种情况提供解决方案,我们希望我们的应用程序轮询一些其他服务以获取“工作项”,然后将其转换为我们应用程序中的 API 调用。
Microsoft.AspNetCore.TestHost包,我可以创建一个TestClient允许我向自己发出请求的包(请参阅此处)。但这里存在一些不确定性:
TestHost是用于集成测试。在生产环境中使用它安全吗?TestServer在常规托管的同时进行这样的运行?TestClients我可以从单个实例创建多个TestServer实例并从不同的线程使用它们吗?所以我确信必须有一种更干净、更直接的方法来从我自己的应用程序中以编程方式调用请求管道......
middleware request-pipeline asp.net-core asp.net-core-testhost
在ASP.Net Core 2.0中,我试图返回带有状态代码的格式化为json或xml的消息。我从控制器返回自定义消息没有问题,但是我不知道如何在中间件中处理它。
到目前为止,我的中间件类如下所示:
public class HeaderValidation
{
private readonly RequestDelegate _next;
public HeaderValidation(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext)
{
// How to return a json or xml formatted custom message with a http status code?
await _next.Invoke(httpContext);
}
}
Run Code Online (Sandbox Code Playgroud) request-pipeline asp.net-core asp.net-core-middleware asp.net-core-2.0
在ASP.Net Core 2.0中,我试图在自定义中间件中验证传入的请求标头。
问题是我不怎么提取所有键值对标头。我需要的标头存储在受保护的属性中
protected Dictionary<string, stringValues> MaybeUnknown
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的中间件类如下所示:
public class HeaderValidation
{
private readonly RequestDelegate _next;
public HeaderValidation(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext)
{
IHeaderDictionary headers = httpContext.Request.Headers; // at runtime headers are of type FrameRequestHeaders
// How to get the key-value-pair headers?
// "protected Dictionary<string, stringValues> MaybeUnknown" from headers is inaccessbile due to its protection level
// Casting headers as Dictionary<string, StringValues> results in null
await _next.Invoke(httpContext);
}
}
Run Code Online (Sandbox Code Playgroud)
我的目标是提取所有请求标头,而不仅仅是我必须知道特定键的几个选定标头。
c# request-pipeline asp.net-core asp.net-core-middleware asp.net-core-2.0
使用像python(或php)这样的脚本语言,事物不会像.net或java那样编译成字节码.
那么这是否意味着在每个请求上,它必须遍历整个应用程序并解析/编译它?或者至少是给定调用堆栈所需的所有代码?