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

标签 cross-domain wcf-web-api

我似乎遇到了跨域访问问题。 我看到一些解决方案表明添加“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/

相关文章:

javascript - 如何防止跨域iframe window.top访问?

header - 如何测试 CORS header

c# - ASP.NET WebAPI 中 HttpServiceHost 的等价物是什么?

rest - WCF、Web API、WCF REST 和 Web 服务之间的区别?

.net - 什么对 REST API 更好? WCF Web API(预览版 4)或 OpenRasta 或其他什么?

javascript - 从另一个域获取 html 内容时出错

ajax - 跨域ajax调用的问题

jquery - 使用 JQuery 修改 iFrame 中内容的 CSS

C# WCF Web Api 4 MaxReceivedMessageSize

c# - 集成 DotNetOpenAuth 和 WCF WebAPI