我遇到了一个我正在处理的网站的问题。 从JavaScript函数调用WebMethod:
var ajaxOptions = {
url: "/layouts/foobar/Foo.aspx/GetBar"
}
$.ajax(ajaxOptions).done(function(result) {
loadResult(result, a);
});
Foo.Aspx中的方法GetBar如下所示:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static object GetBar()
{
return FoobarManager.GetItems();
}
该函数返回一个有效的JSON对象。 Sitecore用于FoobarManager。例如:
Context.Database.GetItem("/sitecore/content/foobar");
在开发和测试环境中,事情运行得非常顺利,没有任何问题。在部署到登台环境后,我看到GetBar函数的响应是我们的自定义404页面。我认为这是因为Sitecore试图解决路径“/layouts/foobar/Foo.aspx/GetBar”并失败。
由于它适用于D和T环境,因此必须是配置问题。 我将GetBar网址添加到IgnoreUrlPrefixes设置中。 这导致ajax调用中的响应为500:Sitecore.Context.Database为null。 我认为它与ItemResolver有关,但我无法理解为什么它在D和T上工作但在A上没有。
我该怎么做才能正确解析网址?
答案 0 :(得分:3)
你有两件相互矛盾的事情。如果您将/layouts/foobar/Foo.aspx
路径添加到必须执行的IgnoreUrlPrefixes
设置(就像您所做的那样),那么Sitecore将不会在其中运行其上下文。这意味着,您的代码Context.Database...
无效。我建议你按名称获取数据库。你需要发布的“网络”数据库吗?你需要弄清楚你需要哪一个,但是这样:
var db = Sitecore.Configuration.Factory.GetDatabase("web"); // assumes you need the web DB
var foobar = db.GetItem("/sitecore/content/foobar");
TL; DR :没有上下文,因此您无法从中获取数据库。