我似乎遇到了跨域访问问题。 我看到一些解决方案表明添加“Access-Control-Allow-Origin: *”,但我不知道在哪里可以做到这一点。
我需要创建一些处理程序吗?
我正在使用 WCF Web API。
Error: XMLHttpRequest cannot load http://localhost:8081/Song/0. Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin.
编辑
我注意到只有当 HTTP 方法是 PUT 或 DELETE 时才会发生这种情况。 我可以使用 GET 或 POST 成功发出请求。
我正在使用 jquery 发出请求。
$.ajax({
url: Settings.RESTfulEndPointFor('Song/' + songID),
type: 'DELETE',
success: function (response) {
callback(response);
}
});
我不知道为什么,但这似乎会导致方法选项带有 Access-Control-Request-Method: DELETE。
有人知道是什么原因造成的吗?
感谢任何帮助。
最佳答案
通过 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 文件中,我无需为此修复更改该文件。
我知道在发送响应消息之前我必须在某处添加 header 。
经过一番搜索和黑客攻击后,我发现了 ServiceHost 对象的 Authorization 属性。 Authorization 属性是 ServiceAuthorizationBehavior 类的实例,该类的对象有一个名为 ServiceAuthorizationManager 的属性,该属性是 ServiceAuthorizationManager 类的实例。
通过创建一个继承自 ServiceAuthorizationManager 的新类并将其设置为 ServiceHost 实例的 Authorization 行为的 ServiceAuthorizationManager 属性,您可以拦截对服务的所有调用。
这就是我实现类(class)的方式
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();
您必须添加对以下程序集的引用:
- System.ServiceModel.Web
希望这有帮助。
来源:
关于cross-domain - Access-Control-Allow-Origin 不允许 WCF Web API RESTful,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6308394/