服务执行期间的ServiceStack操作顺序问题 [英] ServiceStack order of operations problem during the execution of a Service

查看:16
本文介绍了服务执行期间的ServiceStack操作顺序问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  1. 首先,HttpContext.Current必须由系统填充。
  2. 接下来,我们需要在AppHost : AppHostBase上触发一个事件,以允许我们初始化中间层。我们目前正在尝试AppHost.OnPreExecuteServiceFilter,但由于调用了Plugins,这被证明是有问题的。请继续阅读。
  3. 接下来,我们编写了一个插件来执行身份验证,该插件被添加到AppHost.Configure中的插件中。我们需要在步骤2之后调用它。
  4. 然后我们希望调用我们的服务代码。
  5. 最后,我们需要调用AppHost.OnEndRequest.
我们上面面临的问题是,我们的身份验证插件在AppHost.OnPreExecuteServiceFilter之前被调用,因此我们的代码失败,因为我们还没有初始化中间层。因此,步骤2和步骤3目前的顺序是错误的。我们该怎么解决这件事?在填充HttpConext.Current之后、调用Plugins之前是否会触发不同的AppHost事件?或者,我们是否可以将插件配置为在AppHost.OnPreExecuteServiceFilter之后立即调用?

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

推荐答案

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

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

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

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

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

此方法在执行服务之前执行,在此方法之后但在服务之前执行的其他筛选器只有Service FiltersAction Request Filter属性。

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

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

以及在调用插件之前?

这是不可能回答的,因为你的问题遗漏了关于你的插件到底在哪里注册其定制处理程序的重要信息?也就是说,在此之前执行什么过滤器取决于您的插件正在注册什么请求过滤器。我们的Order of Operations页面记录了在请求期间执行不同处理程序的顺序。

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

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

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

E,G.在服务中,您可以从base.Request访问IRequest

这篇关于服务执行期间的ServiceStack操作顺序问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆