2

我正在本地机器上测试一些 Web 服务。因为测试页面位于端口 80 的根目录上,并且 Web 服务位于不同的端口上,所以我从 Chrome 的诊断工具中收到以下错误:

XMLHttpRequest cannot load http://PCNAME:8083/PackageSearch. Origin http://PCNAME is not allowed by Access-Control-Allow-Origin.

经过一番搜索,我发现了 ServiceStack 的 CORS 特性,并将以下属性放在我的 Web 服务上:

[EnableCors(allowedMethods: "GET, POST")]

但是,错误仍然存​​在。这是ajax调用:

function packageSearch(tourCode) {
            var searchUrl = url + 'PackageSearch';
            var searchData = {
                TourCode: tourCode,
            };
            $.ajax(searchUrl,{
                    data : JSON.stringify(searchData),
                    type: 'POST',
                    contentType: 'application/json, charset=utf-8',
                    dataType: 'json',
                    success: function (result) {
                       oTable.fnClearTable();
                   }});
        };

url在哪里http://PCNAME/

编辑

我什至在配置阶段设置了以下内容:

    public override void Configure(Funq.Container container)
    {
        Plugins.Add(new CorsFeature());

        RequestFilters.Add((httpReq, httpRes, requestDto) =>
            {
                if (httpReq.HttpMethod == "OPTIONS")
                    httpRes.End();
            });
        base.SetConfig(new EndpointHostConfig
        {
            DefaultContentType = "application/json",
            GlobalResponseHeaders = {
            { "Access-Control-Allow-Origin", "*" },
            { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" },
            { "Access-Control-Allow-Headers", "Content-Type, origin, accept" },
        }
        });
        });
    }   // Configure
4

2 回答 2

1

我认为这段代码看起来很可疑:

if (httpReq.HttpMethod == "OPTIONS")
    httpRes.End();

我认为尽管您将所有标头响应设置为发送 CORS 标头,但您可能会短路 HTTP 响应标头 - 它们永远不会被发送。您可以验证您是否使用 Fiddler 检查发回的确切 http 响应标头。

请参阅此 SO 答案:ServiceStack 在 OPTIONS 请求上返回 405 他们在调用 httprequest.end() 之前发送标头。

你可能必须这样做:

httpRes.AddHeader("Access-Control-Allow-Origin", "*");

... 在调用 response.end() 之前

于 2013-06-23T03:14:04.337 回答
1

您需要指定 ContentType 并且可能必须执行预检消息 (OPTIONS) 才能进行握手,从而允许您继续进行跨域调用。

于 2013-06-11T11:33:26.567 回答