好像我有跨域访问问题。 我已经看到一些解决方案表明要添加“Access-Control-Allow-Origin:*”,但我不知道我能在哪里做到这一点。
我是否需要创建一些处理程序?
我正在使用WCF Web API。
错误:XMLHttpRequest无法加载http://localhost:8081/Song/0。 Access-Control-Allow-Origin不允许原点http://localhost:8080。
修改
我注意到只有当HTTP方法是PUT或DELETE时才会发生这种情况。 我可以使用GET或POST成功发出请求。
我正在使用jquery发出请求。
$.ajax({
url: Settings.RESTfulEndPointFor('Song/' + songID),
type: 'DELETE',
success: function (response) {
callback(response);
}
});
我不知道为什么,但似乎这导致方法OPTIONS与Access-Control-Request-Method:DELETE。
有人知道造成这种情况的原因吗?
感谢任何帮助。
答案 0 :(得分:4)
通过AJAX调用连接到WCF RESTful服务时出现此问题
我的javascript是这样的:
var GetData= function(){
var data;
$.ajax({
url: this.server + "/data",
async: false,
type: "GET",
success: function (success) {
data = success;
}
});
return data;
};
我的服务端点已使用此代码打开
ServiceHost host = new ServiceHost(new MyService());
host.Open();
所有重要数据都存储在App.config文件中,我没有必要为此修补程序更改该文件。
我知道在发送响应消息之前我必须在某处添加标题。
经过一些搜索和黑客攻击后,我找到了ServiceHost对象的Authorization属性。 Authorization属性是ServiceAuthorizationBehavior类的一个实例,其对象具有一个名为ServiceAuthorizationManager的属性,该属性是ServiceAuthorizationManager类的一个实例。
通过创建一个继承自ServiceAuthorizationManager的新类并将其设置为ServiceHost实例的Authorization行为的ServiceAuthorizationManager属性,您可以拦截对服务的所有调用。
这就是我实施课程的方式
public class MyServiceAuthorizationManager : ServiceAuthorizationManager
{
protected override bool CheckAccessCore(OperationContext operationContext)
{
HttpResponseMessageProperty prop = new HttpResponseMessageProperty();
prop.Headers.Add("Access-Control-Allow-Origin", "*");
operationContext.OutgoingMessageProperties.Add(HttpResponseMessageProperty.Name, prop);
return true;
}
}
然后我宣布我的ServiceHost对象(在主机打开之前)我添加了这一行
host.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager();
执行此操作,重建并运行我的服务后,错误消息停止显示。万岁!
最后,我读了一篇文章,描述了ServiceHost类是为SOAP / WSDL服务而非RESTful服务而设计的。对于RESTful服务,应使用WebServiceHost对象。
所以
ServiceHost host = new ServiceHost(new MyService());
host.Open();
变为
WebServiceHost host = new WebServiceHost(new MyService());
host.Open();
您必须添加对以下程序集的引用:
希望这有帮助。
来源:
答案 1 :(得分:1)
通常你把它放在回复的标题中。所以把它放在标题中你修改/插入其他标题值,如这个
header('Access-Control-Allow-Origin: *) //change it according to however header is set in wcf , since this is php syntax
点是您的回复应该有这个标题。
答案 2 :(得分:1)
您使用OPTIONS方法和Access-Control-Request-Method:DELETE标头看到的请求称为“预检请求”。 CORS规范要求使用具有副作用的方法(如DELETE)来确保资源可以满足请求。
查看规范>>的此部分 http://www.w3.org/TR/cors/#cross-origin-request-with-preflight0
不幸的是我不知道如何使用wcf web api来处理这种类型的请求。
答案 3 :(得分:0)
我创建了
AllowCrossDomainRequestHandler : DelegatingChannel
并且我正在注册这个标题:
response.Headers.Add("Access-Control-Allow-Origin", "*");
答案 4 :(得分:0)
我使用以下响应标头开始工作:
res.writeHead(200, {
'Content-Type': 'text/plain',
'Access-Control-Allow-Methods': 'DELETE, POST, GET, OPTIONS',
'Access-Control-Allow-Origin': '*'
});