Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Web API 2与Kentico一起使用时,SiteContext为空_C#_Asp.net_Asp.net Web Api2_Kentico - Fatal编程技术网

C# 将Web API 2与Kentico一起使用时,SiteContext为空

C# 将Web API 2与Kentico一起使用时,SiteContext为空,c#,asp.net,asp.net-web-api2,kentico,C#,Asp.net,Asp.net Web Api2,Kentico,我已经用Kentico9CMS平台实现了WebAPI2(一般如下),总体来说它运行良好。然而,在我的控制器中,我发现SiteContext.CurrentSite总是返回null。这是预期的行为还是我做错了什么 不确定这是否有区别,但该平台在一个域下承载多个站点,如所示。因此,我的网站正在以下URL上运行 domain.com/site1 domain.com/site2 等等 …API在以下路径下可用 domain.com/site1/customapi domain.com/site2

我已经用Kentico9CMS平台实现了WebAPI2(一般如下),总体来说它运行良好。然而,在我的控制器中,我发现
SiteContext.CurrentSite
总是返回null。这是预期的行为还是我做错了什么

不确定这是否有区别,但该平台在一个域下承载多个站点,如所示。因此,我的网站正在以下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()


嗯,没有人回答这个问题,所以我试试看。SiteContext在内部使用HttpContext.Current,由于某些相关内容(您的操作是否包含wait?),它在web api中有点“不可靠”。这可以解释在控制器中调用
SiteContext.CurrentSite
null的原因

回到你的问题上来——你需要在你的应用程序(可能是web api控制器、服务或存储库)中获取当前的
SiteInfo
——这意味着你可能知道你当前的域或应用路径。我会尝试使用
SiteInfoProvider
类似于
GetRunningSiteInfo(stringdomainname,stringapplicationpath)
获取当前
SiteInfo


祝你好运

有趣的是,当我再次面对同样的问题时,我遇到了这个问题!对不起,我以前没有把答案记下来。你说得对,这是正确的答案。有关使用此方法的扩展方法,请参见上面的编辑。
public static SiteInfo GetCurrentSite(this HttpRequestMessage request)
{
    return SiteInfoProvider.GetRunningSiteInfo(request.RequestUri.Host, System.Web.HttpRuntime.AppDomainAppPath);
}