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

ServiceStack order of operations problem during the execution of a Service

我们正在将我们的经典 ASP.NET ServiceStack 应用程序从 v3.9.64 升级到 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 请求时触发的,但它们的发生顺序与以往不同,因此我们面临这个问题。

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

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

Next, we have a Plugin we have written to do authentication that is added to Plugins in AppHost.Configure. We need this to be invoked AFTER Step 2.

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

中执行的自定义过滤器

The problem we face above is that our authentication Plugin is being invoked BEFORE AppHost.OnPreExecuteServiceFilter

此方法在执行服务之前执行,在此方法之后但在服务之前执行的唯一其他过滤器是 Service Filters and Action Request Filter 个属性。

Is there a different AppHost event that is fired after HttpContext.Current is populated

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

and before Plugins are invoked?

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

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

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

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

E,例如。在服务中,您可以从 base.Request.

访问 IRequest