我正在测试本地计算机上的某些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
答案 0 :(得分:1)
您需要指定一个ContentType,并且可能必须执行预检消息(OPTIONS)才能进行握手,以便您继续进行跨域调用。
答案 1 :(得分:1)
我认为这段代码看起来很可疑:
if (httpReq.HttpMethod == "OPTIONS")
httpRes.End();
我认为虽然您设置所有标头响应以发送CORS标头,但您可能会短路HTTP响应标头 - 它们永远不会被发送。您可以验证是否使用Fiddler检查发回的确切http响应标头。
请参阅此答案:ServiceStack returns 405 on OPTIONS request 他们在调用httprequest.end()之前发送标头。
您可能需要这样做:
httpRes.AddHeader("Access-Control-Allow-Origin", "*");
...在调用response.end()
之前