我有一个MVC Web API(在IIS中托管),它位于wwwroot文件夹中,可以在网络中本地访问。我可以执行这样的api调用:http://mylocalapi:133/api/Values/Get
我得到一个结果。
我有一个http://example.org
的外部网站,我想执行相同的http://mylocalapi:133/api/Values/Get
。
面向外部的站点以及内部API站点都托管在同一台服务器上(但它可以是不同的,例如网络外的第三方供应商)
我在我的API中设置了CORS,如下所示:
[EnableCors(origins: "http://example.org", headers: "*", methods: "*")]
但我一直收到以下错误:
XMLHttpRequest cannot load http://mylocalapi:133. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.org' is therefore not allowed access.
因此,我在外部站点创建了一个虚拟目录(APICALLS
),并创建了一个指向本地IIS站点的web.config文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpRedirect enabled="true" destination="http://mylocalapi:133" exactDestination="true" />
</system.webServer>
</configuration>
当我这样做时,我尝试访问这样的API:http://example.org/APICALLS/api/Values/Get
但是我收到以下错误:
XMLHttpRequest cannot load http://mylocalapi:133. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.org' is therefore not allowed access.
我做错了什么,如何解决问题。
答案 0 :(得分:1)
您无法通过JavaScript访问内部网站,因为JavaScript在客户端运行,位于最终用户的计算机上,位于内部网络之外。通过JavaScript访问API的唯一方法是:1)将API公开给外部网络,或者2)在外部站点中创建代理。
代理基本上是一个提供外部访问权限的操作,然后将调用转换为内部API。最简单的,你可以有一个基本上响应类似的行为:
https://foo.com/api?endpoint=/internal/api/endpoint/&someParam=foo
然后,该操作将在查询字符串中获取此信息,并使用该信息通过HttpClient
之类的内容向内部API发出请求。但是,这种方法几乎暴露了整个内部API,因此您可能只是将其移到外面。更好的方法是为需要通过JavaScript进行的特定内部API调用创建特定的端点(操作方法)。
<强>更新强>
如果没有背景,很难在这里给你任何真正的指导。假设有一个内部API端点返回一个窗口小部件列表,并且您希望通过AJAX检索此窗口小部件列表。你需要这样的东西:
public async Task<ActionResult> GetWidgets()
{
// fetch widgets from internal API via HttpClient
return Json(widgets, JsonRequestBehavior.AllowGet);
}
然后,您的AJAX会在您的网站上调用此操作方法的URL,该网站会调用内部API。
答案 1 :(得分:0)
在Register方法
中的WebApiConfig类中添加以下代码config.EnableCors();