访问控制 - 允许来源不允许WCF Web API RESTful
似乎我有一个跨域访问问题。 我见过一些解决方案,指出添加“Access-Control-Allow-Origin:*”,但我不知道我在哪里可以做到这一点。访问控制 - 允许来源不允许WCF Web API RESTful
我是否需要创建一些处理程序?
我正在使用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。
有没有人知道是什么原因造成的?
任何帮助表示赞赏。
通常情况下,你把它放在响应标题中。所以把它放在你修改/插入其他标题值这样的标题中
header('Access-Control-Allow-Origin: *) //change it according to however header is set in wcf , since this is php syntax
点是你的回应应该有这个标题。
我创建
AllowCrossDomainRequestHandler : DelegatingChannel
和每个响应我注册这个头:
response.Headers.Add("Access-Control-Allow-Origin", "*");
我得到这个使用下面的响应头的工作:
res.writeHead(200, {
'Content-Type': 'text/plain',
'Access-Control-Allow-Methods': 'DELETE, POST, GET, OPTIONS',
'Access-Control-Allow-Origin': '*'
});
首先,对于大多数网页浏览器,无法真正解决跨域限制。大多数甚至不会让你改变“接受”标题。所以你必须使用JSONP。 JSONP是从跨域服务获取JSON数据的一种方式,但是它以javascript代码片段的形式返回 - 这是允许的。它的工作方式是向服务提供回调函数名称,然后跨域服务返回一个简单的javascript,并将实际的JSON值作为参数嵌入到回调函数中。使用WCF WebApi(预览版6)现在很容易。使用NuGet在VS 2010中安装它。安装后,请查看here了解更多信息。
您使用OPTIONS方法和Access-Control-Request-Method:DELETE标题看到的请求称为“预检请求”。 CORS规范要求使用具有副作用的方法(如DELETE)来确保资源与请求一致。
退房规范的这部分>> http://www.w3.org/TR/cors/#cross-origin-request-with-preflight0
不幸的是,我不知道如何使这种要求的工作与WCF的Web API。
连接到通过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实例的授权行为的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();
您必须添加引用以下组件:
- System.ServiceModel.Web
希望这可以帮助。
来源:
它为我工作!非常感谢。但我仍然有 “方法:选项 状态码:405方法不允许” 但方法GET无论如何工作..有线!我很高兴它的工作! – 2013-07-22 13:46:33
您好,感谢您的回复。我在我的问题中添加了更多信息。我无法将此标题添加到我的回复中。在执行请求的方法之前引发此错误。 – aumanets 2011-06-10 16:49:12