【问题标题】:Referencing web api in virtual directory with jQuery Ajax使用 jQuery Ajax 在虚拟目录中引用 web api
【发布时间】:2013-02-27 17:48:21
【问题描述】:

我和我的同事正在开发一个 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。

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

【问题讨论】:

  • location.host 仅解析您的顶级域,其中不包含虚拟目录名称。 url 应该类似于application.com/virtualdirectory/api/Subscriptions。您可以通过浏览 url 来轻松地进行测试。一旦你有正确的 url,我会尝试在你的 javascript 函数中使用它。如果成功,请查看如何使其独立安装。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您的问题是 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 时是一个要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-07
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多