asp.net - Cómo permitir la API web MVC interna desde un sitio externo fuera de la red
asp.net-mvc cors (2)
Agregue el siguiente código en su clase WebApiConfig en el método de registro
config.EnableCors();
Tengo una API web MVC (alojada en IIS) que está en la carpeta wwwroot y localmente accesible dentro de la red. Puedo ejecutar llamadas API como esta:
http://mylocalapi:133/api/Values/Get
y obtengo un resultado .
Tengo un sitio externo que es
http://example.org
y me gustaría ejecutar el mismo
http://mylocalapi:133/api/Values/Get
.
Tanto el sitio externo como el sitio API interno están alojados en el mismo servidor (pero puede ser diferente, por ejemplo, un proveedor externo fuera de la red)
Tengo CORS configurado en mi API de esta manera:
[EnableCors(origins: "http://example.org", headers: "*", methods: "*")]
Pero sigo recibiendo el siguiente error:
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.
Así que
APICALLS
, creé un directorio virtual (
APICALLS
) en mi sitio externo y creé un archivo web.config que apuntará al sitio IIS local:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpRedirect enabled="true" destination="http://mylocalapi:133" exactDestination="true" />
</system.webServer>
</configuration>
Cuando hago eso, intento acceder a la API de esta manera:
http://example.org/APICALLS/api/Values/Get
pero obtengo el siguiente error:
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.
¿Qué estoy haciendo mal y cómo puedo resolver el problema?
No puede acceder a un sitio solo interno desde JavaScript, ya que JavaScript se ejecuta en el lado del cliente, en la máquina del usuario final, fuera de su red interna. La única forma de acceder a la API a través de JavaScript es 1) exponer la API a la red externa o 2) crear un proxy dentro de su sitio externo.
El proxy sería básicamente una acción o acciones que ofrecen acceso externo, y luego traducen las llamadas a su API interna. En el más simple, podría tener una sola acción que básicamente responde a algo como:
https://foo.com/api?endpoint=/internal/api/endpoint/&someParam=foo
La acción tomaría esta información en la cadena de consulta y la usaría para realizar una solicitud a su API interna a través de algo como
HttpClient
.
Sin embargo, este enfoque expone más o menos toda su API interna, por lo que también podría moverlo afuera en ese punto.
El mejor enfoque sería crear puntos finales específicos (métodos de acción) para llamadas API internas específicas que debe realizar a través de JavaScript.
ACTUALIZAR
Es difícil darle una dirección real aquí sin contexto. Supongamos que hay un punto final de API interno que devuelve una lista de widgets y desea recuperar esta lista de widgets a través de AJAX. Necesitarías algo como:
public async Task<ActionResult> GetWidgets()
{
// fetch widgets from internal API via HttpClient
return Json(widgets, JsonRequestBehavior.AllowGet);
}
Luego, su AJAX llamaría a la URL de este método de acción en su sitio web, que bajo el capó llama a la API interna.