访问控制 - 允许来源不允许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 

点是你的回应应该有这个标题。

+0

您好,感谢您的回复。我在我的问题中添加了更多信息。我无法将此标题添加到我的回复中。在执行请求的方法之前引发此错误。 – aumanets 2011-06-10 16:49:12

我创建

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

希望这可以帮助。

来源:

+0

它为我工作!非常感谢。但我仍然有 “方法:选项 状态码:405方法不允许” 但方法GET无论如何工作..有线!我很高兴它的工作! – 2013-07-22 13:46:33