1

我有一个包含 5 个不同项目的空白 asp.net 解决方案。其中一个是asp.net web api,另一个是带有一堆html页面的空白网站。我正在使用backbone.js/jQuery 在解决方案中调用web api。我的空白网站在不同的端口上运行,而我的 web api 在不同的端口上运行。

//Collection
var AuditsCollection = Backbone.Collection.extend({

    url: 'http://localhost:56501/api/searchaudits',

    sync: function (method, model, options) {
                if (!options.crossDomain) {
                    options.crossDomain = true;
                }

                options.timeout = 1000;
                alert(method + ": " + JSON.stringify(model));
                return Backbone.sync(method, model, options);
            },
});
var audits = new AuditsCollection();

// Model
var Audit = Backbone.Model.extend({ });
var audit = new Audit({ auditNumber: "A12" });

audits.add(audit);

// POST CALL - 我正在发送这个模型并期望返回另一个 JSON 对象作为响应。

 audit.save({}, {

    success: function (response) {
        alert("Got audits successfully" + response);
    },
    error: function (response) {

        alert("Error.. Go home now");
    }
});

我仍然收到此错误

XMLHttpRequest 无法加载http://mydomain:56501/api/searchaudits。Access-Control-Allow-Headers 不允许请求标头字段 Content-Type。

4

1 回答 1

1

我想我弄清楚了问题所在。该项目设置为以下结构。

错误:

- 解决方案

-- Project 1 (Web API) - running on `http://localhost:80/api`

-- Project 2

-- Project 3

-- Project 4 (Views) - running on `http://localhost:3000/`

因此,当我开始发出 ajax 请求时,它开始给出异常,例如

XMLHttpRequest 无法加载http://localhost:80/api/searchaudits。Access-Control-Allow-Headers 不允许请求标头字段 Content-Type。

选项localhost:80/api/searchaudits405(不允许的方法)

XMLHttpRequest 无法加载 /api/searchaudits

我不知道它会考虑具有不同端口和不同域的域。

解决方案:

覆盖 Backbone.Sync 方法 -参考

在您的 Web Api 项目 web.config 文件中,添加以下内容

<system.webServer>
    <httpProtocol>
          <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept"/>
          </customHeaders>
        </httpProtocol>
</system.webServer>

StackOverflow 中有关于这个问题的零碎答案,但这是将完整的解决方案放在一个地方的努力。

于 2013-05-22T11:16:01.347 回答