繁体   English   中英

服务执行期间的 ServiceStack 操作顺序问题

[英]ServiceStack order of operations problem during the execution of a Service

我们正在将经典的 ASP.NET 应用程序从 v3.9.64 升级到 ServiceStack v5.11.0,并渴望成为 ServiceStack 的付费客户。 但是我们必须解决这个问题。 ServiceStack 中的生命周期和操作顺序发生了变化。 在由 ServiceStack 处理的请求生命周期中,有某些点HttpContext.Current尚未填充。 我们所有的代码都希望设置它,因此我们必须在我们的处理或请求中避免这种情况。 以下是我们认为需要的操作顺序。

  1. 首先, HttpContext.Current必须由系统填充。
  2. 接下来,我们需要在我们的AppHost: AppHostBase允许我们初始化我们的中间层。 我们目前正在尝试 AppHost.OnPreExecuteServiceFilter,但由于调用了插件,这被证明是有问题的。 请继续阅读。
  3. 接下来,我们编写了一个插件来执行身份验证,该插件已添加到 AppHost.Configure 中的插件中。 我们需要在第 2 步之后调用它。
  4. 然后我们希望我们的服务代码被调用。
  5. 最后,我们需要调用 AppHost.OnEndRequest。

我们上面面临的问题是我们的身份验证插件在 AppHost.OnPreExecuteServiceFilter 之前被调用,因此我们的代码失败,因为我们还没有初始化我们的中间层。 因此,当前第 2 步和第 3 步的顺序错误。 我们如何解决这个问题? 在填充 HttpContext.Current 之后和调用插件之前是否会触发不同的 AppHost 事件? 或者我们可以将我们的插件配置为在 AppHost.OnPreExecuteServiceFilter 之后调用吗?

关于这一点的进一步说明。 在 v3.9.64 中,我们的 Global.Application_BeginRequest 和 EndRequest 事件被用于上述目的,并且始终运行良好。 我确实看到这些事件是在传入的 ServiceStack 请求时触发的,但它们的发生顺序与过去不同,因此我们面临这个问题。

操作顺序只是在 ServiceStack 请求中执行不同挂钩和过滤器的顺序。

OnPreExecuteServiceFilter ,就是在执行服务之前执行的过滤器。

接下来,我们编写了一个插件来执行身份验证,该插件已添加到 AppHost.Configure 中的插件中。 我们需要在第 2 步之后调用它。

AppHost.Configure()仅在启动时执行一次,用于配置您的 AppHost。 如果您希望插件在请求期间执行逻辑,则需要注册一个在ServiceStack Request Pipeline中执行的自定义过滤器。

我们上面面临的问题是我们的身份验证插件在 AppHost.OnPreExecuteServiceFilter 之前被调用

此方法在执行服务之前执行,在此方法之后但在服务之前执行的唯一其他过滤器是服务过滤器操作请求过滤器属性。

填充 HttpContext.Current 后是否会触发不同的 AppHost 事件

HttpContext.Current在执行任何 ServiceStack 请求之前由 ASP.NET 框架填充,这意味着它总是在ServiceStack 请求管道中的任何过滤器之前填充。 它不会被填充的主要原因是如果在运行时的请求期间没有从 ASP.NET 请求工作线程访问它。

在调用插件之前?

这是不可能回答的,因为您的问题遗漏了关于您的插件究竟在哪里注册其自定义处理程序的重要信息? 即在此之前执行的过滤器取决于您的插件正在注册的请求过滤器。 在我们的操作顺序页面中记录了请求期间执行不同处理程序的顺序。

如果您指的是您的插件Register(IAppHost) ,这就像AppHost.Configure()仅在启动时执行一次,您无法在启动时访问HttpContext.Current ,它仅在请求期间可用。 Startup 初始化逻辑是您的插件将注册其请求过滤器的地方,例如appHost.PreRequestFiltersappHost.GlobalRequestFilters ,它们在执行 ServiceStack 服务之前的请求期间执行。 *ResponseFilters在服务执行后执行。

现在HttpContext.Current用于在请求上下文不可用时从 singleton 上下文访问 ASP.NET 请求上下文,但这在 ServiceStack 中通常是不必要的,因为每个请求过滤器都可以从 ServiceStack IRequest.OriginalRequest检索 ASP.NET 请求上下文,例如:

PreRequestFilters.Add((req, res) =>
{
    var aspReq = req.OriginalRequest as HttpRequestBase;
});

例如。 在 Service 中,您可以从base.Request访问IRequest

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM