0

我和我的同事正在开发一个 Web API,我们正在使用 knockoutjs(通过 Umbraco CMS)进行通信。为了避免遇到浏览器内置的跨站点脚本安全性,我们将 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。

编辑 编辑 编辑 编辑 编辑 这很愚蠢。也许它是几种不同解决方案的高潮,也许不是,但这一切都归结为提交按钮。是的。通过将按钮类型从“提交”更改为“按钮”,一切正常。天哪,这太愚蠢了。

4

2 回答 2

0

您需要将 API 的路径添加到站点 web.config 中的“umbracoReservedPaths”appSetting。这将告诉 umbraco 从处理中排除该路径。Jonas Ericksson 在他写的博客文章中给出了一个很好的例子来说明如何做到这一点。

于 2013-02-26T14:27:00.390 回答
-1

您的问题是 WebApi 路由被 Umbraco 覆盖。

为了让 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 时.

于 2013-02-26T14:58:27.987 回答