Access-Control-Allow-Origin不允许WCF Web API RESTful

时间:2011-06-10 15:16:40

标签: cross-domain wcf-web-api

好像我有跨域访问问题。 我已经看到一些解决方案表明要添加“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。

有人知道造成这种情况的原因吗?

感谢任何帮助。

5 个答案:

答案 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();

您必须添加对以下程序集的引用:

  • System.ServiceModel.Web

希望这有帮助。

来源:

答案 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': '*'
    });