【问题标题】:Ajax - 'Origin localhost is not allowed by Access-Control-Allow-Origin'Ajax - 'Access-Control-Allow-Origin 不允许 Origin localhost'
【发布时间】:2013-03-10 04:51:12
【问题描述】:

我对 Ajax 比较陌生,只是负责这个跨域调用。我们的网页上有一个文本框,用户将使用它来搜索公司名称。通过单击文本框旁边的按钮,将请求 Ajax 调用。不幸的是,Web 服务位于一个单独的域中,因此这自然会引起问题。

以下是我完成这项工作的最佳尝试。我还应该注意,此调用的目的是以 XML 格式返回结果,该结果将在请求的 success 部分中进行解析。

这里又是错误信息:

Origin http://localhost:55152 is not allowed by Access-Control-Allow-Origin.

我不知道该怎么做才能解决问题,任何想法都将不胜感激。

function GetProgramDetails() {
    var URL = "http://quahildy01/xRMDRMA02/xrmservices/2011/OrganizationData.svc/AccountSet?$select=AccountId,Name,neu_UniqueId&$filter=startswith(Name,\'" + $('.searchbox').val() + "\')";
    var request = $.ajax({
        type: 'POST',
        url: URL,
        contentType: "application/x-www-form-urlencoded",
        crossDomain: true,
        dataType: XMLHttpRequest,
        success: function (data) {
            console.log(data);
            alert(data);
        },
        error: function (data) {
            console.log(data);
            alert("Unable to process your resquest at this time.");
        }
    });
}

【问题讨论】:

  • 尝试在您的响应标头中添加 Access-Control-Allow-Origin: *。
  • 你能提供一个例子来说明如何做到这一点吗?
  • 好的。这是 c# 代码。尝试 Response.AppendHeader("Access-Control-Allow-Origin", Request.Headers["Origin"]);或 Response.AppendHeader("Access-Control-Allow-Origin", "*");
  • 抱歉,还是有点失落——这是哪里去了?在 Ajax 调用中?我用的C#语言很完美。
  • 您的 ajax 调用很好。在您的服务器方法 (url) 中,您需要为“Access-Control-Allow-Origin”设置响应标头以匹配请求来源或设置 * 通配符.如果您将 ajax 调用与 withCredentials=true 一起使用,通配符可能不起作用。但在这里你似乎不喜欢这样做。所以尝试任何一个应该可以正常工作的选项。

标签: c# ajax jquery xmlhttprequest cross-domain


【解决方案1】:

此错误是由于跨域资源共享中强制执行的限制。这已作为安全功能的一部分实现,以通过跨域调用限制资源的客户端(域)。当您向 web 服务或 api 或类似服务发送请求时,它会在服务器或目标(此处为您的 api)的请求中添加 Origin 标头,以验证请求是否来自授权来源。理想情况下,api/server 应该在它收到的Request header 中查找Origin,并可能根据允许向其提供资源的一组源(域)进行验证。如果它来自允许的域,它将在响应标头中添加与 "Access-Control-Allow-Origin" 值相同的域。为此也允许使用通配符,但问题是,有了通配符权限,任何人都可以发出请求并获得服务(有一些限制,例如通过 windows auth 或 cookie 对 api 进行身份验证,您需要在其中发送 withCredentials* 是不允许的)。在响应标头中使用通配符来源并不是一个好习惯,因为它对所有人开放。

这些是使用值设置响应标头的一些方法:-

Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: http://yourdomain.com

您甚至可以在同一个响应中添加多个 Access-Control-Allow-Origin 标头(我相信在大多数浏览器中都可以使用)

Access-Control-Allow-Origin: http://yourdomain1.com
Access-Control-Allow-Origin: http://yourdomain2.com
Access-Control-Allow-Origin: http://yourdomain3.com

在服务器端(c# 语法)你可以这样做:-

var sourceDomain = Request.Headers["Origin"]; //This gives the origin domain for the request
     Response.AppendHeader("Access-Control-Allow-Origin", sourceDomain ); //Set the response header with the origin value after validation (if any) .Depending on the type of application you are using syntax may vary.

希望对你有帮助!!!

【讨论】:

  • 我猜["Origin"] 会和http://yourdomain.com 一样吗? (在我的情况下是http://localhost:55152
  • 是的。您可以通过调试 Request.Headers["Origin"] 或使用 fiddler 在您的请求中查找标头来在您的服务器代码中确认它..
  • 这个要写哪个文件?或者没有提到在哪里写这个。
  • 其他人可以确认这是在哪里添加的吗?尝试在我的 ASP.NET 项目中解决此问题,以便我可以从客户端调用 WebService 方法。
猜你喜欢
  • 2013-09-09
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 2011-11-05
相关资源
最近更新 更多