如何从跨域API获取数据

时间:2014-01-12 20:26:57

标签: c# javascript json api

我正在尝试从其他域中的API获取数据但我收到此错误:

  

XMLHttpRequest无法加载https://www.bitstamp.net/api/ticker/。没有   请求中存在“Access-Control-Allow-Origin”标头   资源。因此不允许原点'localhost'   访问。

我尝试在标题中添加它,但它仍然不起作用:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    Access-Control-Allow-Origin: https://www.bitstamp.net
</head>
<body>
<script src="Index.js"></script>
</body>
</html>

这是我的JavaScript:

var ticker = "https://www.bitstamp.net/api/ticker/";
$.ajax({
    dataType: "json",
    url: ticker,
    type: "POST",
    crossDomain: true,
    scriptCharset: "utf-8"
});

我无法使用 JSONP ,因为该网站不支持此功能。 如何在不同的域上使用JSON从API接收数据? 我想用 JavaScript或C#执行此操作。

2 个答案:

答案 0 :(得分:2)

为您的项目添加课程并用它标记您的控制器

public class AllowCrossSiteAttribute : ActionFilterAttribute {

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
       if (actionExecutedContext.Response != null)
         actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
          base.OnActionExecuted(actionExecutedContext);
        }
    }
}

然后在Controller中添加到控制器方法选项,因为如果允许CROSS,第一次调用将是获取的选项

[System.Web.Http.AllowAnonymous]
public HttpResponseMessage Options()
{
    return new HttpResponseMessage(HttpStatusCode.OK);
}

(请注意,此处您不允许使用所有域名,但您可以使用域名列表替换&#34; *&#34;

或使用网络配置(但它适用于所有控制器)

<system.webServer>
    <httpProtocol>
        <customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization" />
            <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

asp.net网络表单的选项可能是

Response.AppendHeader("Access-Control-Allow-Origin", "*");

答案 1 :(得分:0)

如果允许*使用CORS,则会对安全产生影响。来自任何其他网站的脚本将能够从登录用户浏览器中的api获取数据。 永远不要使用*与CORS,将您允许的主机列入白名单。