使用jQuery Ajax引用虚拟目录中的web api

时间:2013-02-26 10:27:11

标签: jquery ajax json asp.net-web-api umbraco

我的同事和我正在使用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。

编辑编辑编辑编辑 这是愚蠢的。也许它是几种不同解决方案的顶点,也许不是,但这一切都归结为提交按钮。 对。通过更改按钮类型表单“提交”到“按钮”一切正常。 哦,上帝,这很傻。

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时是一项要求。