c# - 将 Web API 2 与 Kentico 结合使用时,SiteContext 为 null

标签 c# asp.net asp.net-web-api2 kentico

我已经使用 Kentico 9 CMS 平台(通常遵循 Kentico's documentation )实现了 Web API 2,总体而言,它运行良好。但是,在我的 Controller 中,我发现 SiteContext.CurrentSite 始终返回 null。这是预期的行为还是我做错了什么?

不确定这是否有什么不同,但该平台根据 this documentation 在单个域下托管多个站点。所以我的网站在以下 URL 上运行...

  • 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()

从 Controller 调用该方法
public static SiteInfo GetCurrentSite(this HttpRequestMessage request)
{
    return SiteInfoProvider.GetRunningSiteInfo(request.RequestUri.Host, System.Web.HttpRuntime.AppDomainAppPath);
}

最佳答案

好吧,没有人回答这个问题,所以我会尝试一下。 SiteContext 在内部使用 HttpContext.Current,由于某些原因,它在 Web api 中有点“不可靠”thread and async相关的东西(您的操作是否包含等待?)。这可以解释在 Controller 中调用 SiteContext.CurrentSite 时的 nulls

回到你的问题 - 你需要在你的应用程序中获取当前的 SiteInfo (可能是 Web api Controller 或服务或存储库) - 这意味着你可能知道你当前的域或 appPath。我会尝试使用 SiteInfoProvider 中的内容 例如 GetRunningSiteInfo(string domainName, string applicationPath) 来获取当前的 SiteInfo

祝你好运!

关于c# - 将 Web API 2 与 Kentico 结合使用时,SiteContext 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43143628/

相关文章:

c# - 转换使用反射创建的泛型类型实例

c# - LINQPad:尝试使用使用 [DllImport] 的程序集来访问 C++ dll

javascript 函数在更新面板中进行完整的回发

c# - Web API 和 OData - 传递多个参数

c# - 如何使用 Web API 2 中的重置密码功能

java - 如何修剪 StringBuilder 字符串?

c# - 使用来自桌面应用程序的 MVC 身份代码

asp.net - 在中继器控制中显示 2 个小数位

javascript - ASP.NET 中的自定义复选框设计(ICheck JS)

c# - 在 ASP.NET 5 中为 Web API Controller 模拟 HttpContext