将Web API 2与Kentico一起使用时,SiteContext为null

get*_*ode 2 c# asp.net kentico asp.net-web-api2

我已经使用Kentico 9 CMS平台实现了Web API 2(通常遵循Kentico的文档),并且整体上它运行良好.但是,在我的控制器中,我发现SiteContext.CurrentSite总是返回null.这是预期的行为还是我做错了什么?

根据本文档,不确定它是否有所作为,但平台在单个域下托管多个站点.所以我的网站运行在以下网址...

  • domain.com/site1
  • domain.com/site2
  • 等等

......并且API在以下路径下可用...

  • domain.com/site1/customapi
  • domain.com/site2/customapi
  • 等等

目前我不得不使用Request对象来提取请求路径并针对Kentico的站点进行检查,SiteProvider以找到当前请求与哪个Kentico站点相关,但是我不会因为API运行而需要该网站的一部分.

我能做些什么来正确连接它吗?仅供参考我注意到它LocalizationContext.CurrentCulture会返回一个CultureInfo物体,所以它并不像我完全脱离了Kentico的背景......

更新解决方案

感谢@ martin-makarsky提供以下答案.用它来创建以下扩展方法,可以从控制器中调用Request.GetCurrentSite()

public static SiteInfo GetCurrentSite(this HttpRequestMessage request)
{
    return SiteInfoProvider.GetRunningSiteInfo(request.RequestUri.Host, System.Web.HttpRuntime.AppDomainAppPath);
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*sky 5

好吧,没有人回答这个问题所以我会试一试.SiteContext在内部使用 HttpContext.Current,由于某些线程和异步相关的东西(你的动作是否等待?),在web api中有点'不可靠' .这可以解释您在控制器中nulls调用SiteContext.CurrentSite时的情况.

回到你的问题 - 你需要获得最新的SiteInfoapp(可能是web api控制器或服务或存储库) - 这意味着你可能知道你当前的域或appPath.我会尝试使用的东西从SiteInfoProviderGetRunningSiteInfo(string domainName, string applicationPath)得到电流SiteInfo.

祝好运!