ASP.NET 核心 MVC:从 IAsyncAlwaysRunResultFilter 发出 just-in-time 响应 headers 在 Kestrel 下抛出,但在 IIS Express 下工作
ASP.NET Core MVC: Issuing just-in-time response headers from IAsyncAlwaysRunResultFilter throws under Kestrel, but works under IIS Express
我有一个应用程序会定期发出自定义响应 headers。只有当它在请求开始时检测到特定条件,然后在将响应提供给客户端之前自动发出所需的自定义 headers 时才会发生。
由于这可能在任何时间和任何类型的请求下发生,我使用 MVC 的结果过滤器编写它 - IAsyncAlwaysRunResultFilter
,具体地说。
这在 IIS Express 下工作得很好,因为过滤器总是在响应开始提供给客户端之前触发,所以自定义 headers 可以成功写入。
但是在我将我的项目切换到 Kestrel 之后,我的过滤器开始出现异常,说 "Headers 是 read-only,响应已经开始。".
代码没有其他变化,我只是出于不相关的原因切换到 Kestrel。有没有更好的方法来实现我想要的,以便它在两个主机下都能可靠地工作?
我唯一的要求是将它与具体的控制器和操作分开,因为它是一个 cross-cutting 问题,不应污染每个操作的代码。
我自己解决了这个问题,方法是删除过滤器并将逻辑移到 Response.OnStarting 回调中,我在请求管道的开头注册了回调。它现在可以在两个主机下可靠地工作。
我有一个应用程序会定期发出自定义响应 headers。只有当它在请求开始时检测到特定条件,然后在将响应提供给客户端之前自动发出所需的自定义 headers 时才会发生。
由于这可能在任何时间和任何类型的请求下发生,我使用 MVC 的结果过滤器编写它 - IAsyncAlwaysRunResultFilter
,具体地说。
这在 IIS Express 下工作得很好,因为过滤器总是在响应开始提供给客户端之前触发,所以自定义 headers 可以成功写入。
但是在我将我的项目切换到 Kestrel 之后,我的过滤器开始出现异常,说 "Headers 是 read-only,响应已经开始。".
代码没有其他变化,我只是出于不相关的原因切换到 Kestrel。有没有更好的方法来实现我想要的,以便它在两个主机下都能可靠地工作?
我唯一的要求是将它与具体的控制器和操作分开,因为它是一个 cross-cutting 问题,不应污染每个操作的代码。
我自己解决了这个问题,方法是删除过滤器并将逻辑移到 Response.OnStarting 回调中,我在请求管道的开头注册了回调。它现在可以在两个主机下可靠地工作。