WebMethod无法在Sitecore中访问

时间:2012-09-24 16:57:41

标签: c# javascript json sitecore webmethod

我遇到了一个我正在处理的网站的问题。 从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上没有。

我该怎么做才能正确解析网址?

1 个答案:

答案 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 :没有上下文,因此您无法从中获取数据库。