访问控制头问题发出http请求

时间:2014-11-25 14:16:31

标签: javascript angularjs http

我在Win 2008 R2 Ent服务器上的IIS中安装了一个asp.net mvc5(带有Angular)网站,并且在服务器本身运行该站点时一切正常。

一旦我们从服务器外部访问该站点,我就会收到与CORS相关的错误:

     Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost/api/init?space=razor_RAGE&environment=razor_RAGE&clariteConfig=E:\razor_RAGE\master\bin\clarite_config.xml. This can be fixed by moving the resource to the same domain or enabling CORS.

我认为解决方案是在http请求中添加正确的标头:

    'Access-Control-Allow-Origin': 'true'
然而,它似乎并没有解决CORS问题。

以下是我使用JavaScript创建的请求示例(服务器上的所有功能都很好,但在服务器外部无效):

     this.getRazorInitParams = function () {
        var deferred = $q.defer();
        deferred.notify("Getting init parameters...");
        var razorEnvParams = [];
        $http({
            method: 'GET',
            encoding: 'JSON',
            headers: {
                'Access-Control-Allow-Origin': 'true'
            },
            url: 'breeze/Rage/GetRazorEnv'
        }).success(function (data, status, headers, config) {
            razorEnvParams = data;
            deferred.resolve(razorEnvParams);  
        }).error(function (data, status, headers, config) {
            console.log("Error in userContext.js, getRazorInitParams " + status);
        });
        return deferred.promise;
    }

这是来自c#api层的snipet:

public class initController : ApiController
{        
    public HttpResponseMessage Get()
    {
        // space, env, dom, cConf vars all defined here..

        string resp = DynAggrClientAPI.initApp( space, env, dom, cConf );

        var response = Request.CreateResponse(HttpStatusCode.OK);
        response.Content = new StringContent(resp, Encoding.UTF8, "application/json");

        return response;
    }
}

我正在寻找合适的解决方案。这里有什么我想念的吗?

提前感谢,

鲍勃

1 个答案:

答案 0 :(得分:1)

标头的值应该是特定域或星号,以指示CORS请求可以来自任何域。

Access-Control-Allow-Origin: 'http://example.org'

Access-Control-Allow-Origin: '*'

另请注意,您无法将多个域“列入白名单”。这是一个或全部。

如果您要使用所谓的“复杂”请求(即除了简单的GET或POST请求之外的其他请求),您还需要设置Access-Control-Allow-Methods字段,以及是否要检索特定标头,Access-Control-Allow-Headers也是如此(虽然在这种情况下,不需要它们)。