Asp.net 如何允许网络外部站点的内部MVC Web Api

Asp.net 如何允许网络外部站点的内部MVC Web Api,asp.net,asp.net-mvc,api,cors,Asp.net,Asp.net Mvc,Api,Cors,我有一个MVC Web API(托管在IIS中),它位于wwwroot文件夹中,可以在网络中本地访问。我可以执行如下API调用:http://mylocalapi:133/api/Values/Get我得到了一个结果 我有一个外部站点,http://example.org我想执行相同的http://mylocalapi:133/api/Values/Get 面向外部的站点和内部API站点都托管在同一台服务器上(但可以不同,例如网络外的第三方供应商) 我在API中设置了COR,如下所示: [启用C

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

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

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

我在API中设置了COR,如下所示:

[启用CORS(源代码:http://example.org,标题:“*”,方法:“*”]

但我一直得到以下错误:

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.
XMLHttpRequest无法加载http://mylocalapi:133. 请求的资源上不存在“Access Control Allow Origin”标头。起源'http://example.org因此,不允许访问。

所以绕开它,我在我的外部站点中创建了一个虚拟目录(
APICALLS
),并创建了一个web.config文件,该文件将指向本地IIS站点:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpRedirect enabled="true" destination="http://mylocalapi:133" exactDestination="true" />
    </system.webServer>
</configuration>

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

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

config.EnableCors();

您无法从JavaScript访问仅限内部的站点,因为JavaScript在最终用户的机器上、内部网络之外运行客户端。通过JavaScript访问API的唯一方法是1)向外部网络公开API,或2)在外部站点中创建代理

代理基本上是一个或多个提供外部访问的操作,然后将调用转换为内部API。在最简单的情况下,您可以有一个基本响应如下内容的单个动作:

https://foo.com/api?endpoint=/internal/api/endpoint/&someParam=foo
public async Task<ActionResult> GetWidgets()
{
    // fetch widgets from internal API via HttpClient
    return Json(widgets, JsonRequestBehavior.AllowGet);
}
然后,该操作将在查询字符串中获取该信息,并使用该信息通过类似于
HttpClient
的方式向内部API发出请求。然而,这种方法几乎公开了您的整个内部API,因此此时您最好将其移到外部。更好的方法是为需要通过JavaScript进行的特定内部API调用创建特定端点(操作方法)

更新

没有上下文,很难给你任何真正的方向。假设有一个内部API端点返回一个小部件列表,您希望通过AJAX检索这个小部件列表。您将需要以下内容:

https://foo.com/api?endpoint=/internal/api/endpoint/&someParam=foo
public async Task<ActionResult> GetWidgets()
{
    // fetch widgets from internal API via HttpClient
    return Json(widgets, JsonRequestBehavior.AllowGet);
}
公共异步任务GetWidgets() { //通过HttpClient从内部API获取小部件 返回Json(小部件,JsonRequestBehavior.AllowGet); }
然后,您的AJAX将在您的网站上调用此操作方法的URL,该方法在后台调用内部API。

您试图从外部网站向本地主机发出web请求,我错了吗?如果是,您甚至不能使用虚拟目录。@ibubi?我已经完成了,因此我在API.cs文件中有了头。谢谢您的回复。Javascript没有达到API,还是我错了?我在IIS中有一个指向内部站点的虚拟目录。因此,从技术上讲,Javascript只命中服务器上的虚拟目录,该目录告诉它访问本地站点。我如何实现#1?我试图从API文件夹中复制文件/文件夹,并将其移动到我在外部站点中创建的子文件夹中,但我在那里遇到了不同的错误。或者更好。。。如何实现这一点:
更好的方法是为需要通过JavaScript进行的特定内部API调用创建特定端点(操作方法)。
?非常感谢。您当前正在尝试在请求传入时重定向请求。重定向将导致发送带有
位置
标题的响应。然后,客户端负责向指定的位置发出新请求,但由于该位置是内部的,因此它仍然无法发出新请求。因此,API文件/文件夹必须位于它的IIS站点上,该站点可以从外部访问,例如?不必,但它必须暴露于外部网络。你如何做到这一点是相当无关紧要的。另一种方法是代理请求,如上所示。