我的同事和我正在使用knockoutjs(通过Umbraco CMS)与我们进行通信的Web API。为避免遇到浏览器内置的跨站点脚本安全性,我们将api放在我们网站目录的虚拟目录中。
如果我们在目录中放置一个“愚蠢”的html文件,我们可以毫无问题地与api“交谈”。另一方面,如果我们尝试从umbraco引用虚拟目录中的api,则找不到它。
我四处寻找各种解决方案,但大多数(如果不是全部的话)是,如果您使用的是MVC3,哪种解决方案并没有真正帮助。
以下是尝试联系API的一些javascript:
function subscribe() {
if($("#siteForm").valid()=== true){
alert("add subscriptiooncalled");
var mySubscription = ko.toJS(ViewModel);
var json = JSON.stringify(mySubscription);
alert(json);
$.ajax({
url: API_URL,
cache: false,
type: 'POST',
contentType: 'application/json',
data: json,
success: function (data) {
alert("data is pushed");
},
error: function (error) {
alert("ERROR STATUS: " + error.status + " STATUS TEXT: " + error.statusText);
}
});
}else{
}
}
这样做也不起作用:
var root = location.protocol + "//" + location.host;
var API_URL = root + "/api/Subscriptions/";
请注意,警报仅用于测试目的。无论如何,代码中的url显然不起作用,插入完整的url也不起作用(http://等等)。
有什么建议吗?如果有帮助,请使用Umbraco 4.7.2。
编辑编辑编辑编辑 这是愚蠢的。也许它是几种不同解决方案的顶点,也许不是,但这一切都归结为提交按钮。 对。通过更改按钮类型表单“提交”到“按钮”一切正常。 哦,上帝,这很傻。
答案 0 :(得分:0)
您需要将API的路径添加到站点的web.config中的“umbracoReservedPaths”appSetting中。这将告诉umbraco将该路径排除在处理之外。 Jonas Ericksson在他写的blog post中给出了一个很好的例子。
答案 1 :(得分:-1)
你的问题是Umbraco正在覆盖WebApi路由。
为了让WebApi和Umbraco并排,(在Umbraco 4.11中)你必须实现IApplicationEventHandler,但我担心在4.7这不应该工作,你必须使用不同的东西(如果内存继承自ApplicationBase)供应)。 Umbraco 4.11+所需的代码看起来有点像这样:
public class WebApiStartupHandler : IApplicationEventHandler
{
public void OnApplicationStarted(UmbracoApplication httpApplication, ApplicationContext applicationContext)
{
WebApiConfig.Register(GlobalConfiguration.Configuration); // register web api routes
RouteConfig.RegisterRoutes(RouteTable.Routes); // register mvc routes
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); // register global filters
}
}
这将允许您的webapi项目与您的umbraco网站并排运行,您不必使用虚拟目录。
在web.config文件的appConfig部分中添加“〜/ api”(或者您喜欢用作api根的任何内容)umbracoReservedUrls和umbracoReservedPaths也可以解决您的问题,尤其是在虚拟目录中运行api时是一项要求。