【问题标题】:How to allow internal MVC Web Api from external site outside the network如何允许来自网络外部站点的内部 MVC Web Api
【发布时间】:2017-03-24 14:36:43
【问题描述】:

我有一个 MVC Web API(托管在 IIS 中),它位于 wwwroot 文件夹中,可以在网络中本地访问。我可以执行这样的 api 调用:http://mylocalapi:133/api/Values/Get 并得到结果。

我有一个外部站点 http://example.org,我想执行相同的 http://mylocalapi:133/api/Values/Get

面向外部的站点和内部 API 站点都托管在同一台服务器上(但可以不同,例如网络外的第 3 方供应商)

我在我的 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.

我做错了什么以及如何解决问题。

【问题讨论】:

  • 您正试图从外部站点向您的本地主机发出 Web 请求,我错了吗?如果是,则不能。
  • @ibubi 即使是虚拟目录?

标签: asp.net asp.net-mvc api cors


【解决方案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。

【讨论】:

  • 感谢您的回复。那么Javascript没有达到API,还是我错了?我在 IIS 中有指向内部站点的虚拟目录。因此,从技术上讲,Javascript 只是访问服务器上的虚拟目录,告诉它访问本地站点。我如何实现#1?我试图从 API 文件夹中复制文件/文件夹并将其移动到我在外部站点中创建的子文件夹中,但那里出现了不同的错误。
  • 或者更好……我怎样才能做到这一点:The better approach would be to create specific endpoints (action methods) for specific internal API calls you need to make via JavaScript.?非常感谢
  • 您当前所做的是尝试在请求进入时重定向。重定向将导致发送带有Location 标头的响应。然后,客户端负责向该指定位置发出新请求,但它仍然不能这样做,因为它仅限于内部。
  • 因此 API 文件/文件夹必须位于其 IIS 站点上,该站点可从外部访问,例如 myapisite.org?
  • 不一定,但它必须暴露给外部网络。 如何实现这一点是无关紧要的。另一种方法是代理请求,如上所示。
【解决方案2】:

在注册方法的 WebApiConfig 类中添加以下代码

config.EnableCors();

【讨论】:

  • 我已经完成了,因此我的 API .cs 文件中有标题。
猜你喜欢
  • 2013-12-07
  • 2017-05-17
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
相关资源
最近更新 更多