c# - not - enable cors web api mvc
MVC web api: No hay encabezado ''Access-Control-Allow-Origin'' presente en el recurso solicitado (11)
Intenté todo lo que está escrito en este artículo: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api , pero nada funciona. Estoy tratando de obtener datos de webAPI2 (MVC5) para usar en otro dominio usando angularJS.
mi controlador se ve así:
namespace tapuzWebAPI.Controllers
{
[EnableCors(origins: "http://local.tapuz.co.il", headers: "*", methods: "*", SupportsCredentials = true)]
[RoutePrefix("api/homepage")]
public class HomePageController : ApiController
{
[HttpGet]
[Route("GetMainItems")]
//[ResponseType(typeof(Product))]
public List<usp_MobileSelectTopSecondaryItemsByCategoryResult> GetMainItems()
{
HomePageDALcs dal = new HomePageDALcs();
//Three product added to display the data
//HomePagePromotedItems.Value.Add(new HomePagePromotedItem.Value.FirstOrDefault((p) => p.ID == id));
List<usp_MobileSelectTopSecondaryItemsByCategoryResult> items = dal.MobileSelectTopSecondaryItemsByCategory(3, 5);
return items;
}
}
}
Entiendo el siguiente caso sobre cors. Tal vez sea útil para alguien. Si agrega la función ''WebDav Redirector'' a su servidor, las solicitudes PUT y DELETE fallarán.
Por lo tanto, deberá eliminar ''WebDAVModule'' de su servidor IIS:
- "En la configuración de los módulos IIS, conecte el WebDAVModule, si su servidor web lo tiene, luego quítelo".
O agregue a su configuración:
<system.webServer>
<modules>
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="WebDAV" />
...
</handlers>
Había intentado todo lo que pude encontrar en la red, incluidos los métodos que se dieron en esta respuesta. Después de casi tratar de resolver el problema durante todo el día, he encontrado la solución que me ha funcionado de maravilla.
en el archivo WebApiConfig en la carpeta App_Start , comente todas las líneas de código y agregue el siguiente código:
`public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.EnableCors();
var enableCorsAttribute = new EnableCorsAttribute("*",
"Origin, Content-Type, Accept",
"GET, PUT, POST, DELETE, OPTIONS");
config.EnableCors(enableCorsAttribute);
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
//routeTemplate: "api/{controller}/{id}",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.Add(new BrowserJsonFormatter());
}
public class BrowserJsonFormatter : JsonMediaTypeFormatter
{
public BrowserJsonFormatter()
{
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
this.SerializerSettings.Formatting = Formatting.Indented;
}
public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
{
base.SetDefaultContentHeaders(type, headers, mediaType);
headers.ContentType = new MediaTypeHeaderValue("application/json");
}
}`
La respuesta de @ Mihai-Andrei Dinculescu es correcta, pero para beneficio de los buscadores, también hay un punto sutil que puede causar este error.
Agregar un ''/'' al final de su URL evitará que EnableCors funcione en todos los casos (por ejemplo, desde la página de inicio).
Es decir, esto no funcionará
var cors = new EnableCorsAttribute("http://testing.azurewebsites.net/", "*", "*");
config.EnableCors(cors);
pero esto funcionará:
var cors = new EnableCorsAttribute("http://testing.azurewebsites.net", "*", "*");
config.EnableCors(cors);
El efecto es el mismo si se usa el atributo EnableCors.
La respuesta de @ Mihai-Andrei Dinculescu funcionó para mí, por ejemplo:
-
Agregar un
<httpProtocol>
en la sección<system.webServer>
web.config -
Devolución de respuesta vacía para solicitudes
OPTIONS
a través de la mencionadaApplication_BeginRequest()
englobal.asax
Excepto que su cheque para
Request.Headers.AllKeys.Contains("Origin")
NO funcionó para mí, porque la solicitud contenía un
origing
, así que en minúsculas.
Creo que mi navegador (Chrome) lo envía así para solicitudes CORS.
Resolví esto un poco más genéricamente usando
una
variante
insensible a mayúsculas y minúsculas
de su verificación
Contains
su lugar:
if (culture.CompareInfo.IndexOf(string.Join(",", Request.Headers.AllKeys), "Origin", CompareOptions.IgnoreCase) >= 0) {
Para que cualquier protocolo CORS funcione, debe tener un método OPTIONS en cada punto final (o un filtro global con este método) que devolverá esos encabezados:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: content-type
La razón es que el navegador enviará primero una solicitud de OPCIONES para ''probar'' su servidor y ver las autorizaciones
Pruebe esto para asegurarse de haber configurado CORS correctamente:
[EnableCors(origins: "*", headers: "*", methods: "*")]
¿Sigue sin funcionar? Verifique la presencia de encabezados HTTP.
Puede ser debido a la instalación de los paquetes nuget de Cors.
Si enfrenta el problema después de instalar y deshabilitar cors de nuget, puede intentar reinstalar la API web.
Desde el administrador de paquetes, ejecute
Update-Package Microsoft.AspNet.WebApi -reinstall
Sé que voy a llegar muy tarde. Sin embargo, para cualquiera que esté buscando, pensé en publicar lo que FINALMENTE funcionó para mí. No digo que sea la mejor solución, solo que funcionó.
Nuestro servicio WebApi utiliza el método config.EnableCors (corsAttribute). Sin embargo, incluso con eso, todavía fallaría en las solicitudes previas al vuelo. La respuesta de @ Mihai-Andrei Dinculescu me dio la pista. En primer lugar, agregué su código Application_BeginRequest () para vaciar las solicitudes de opciones. Eso TODAVÍA no funcionó para mí. El problema es que WebAPI todavía no estaba agregando ninguno de los encabezados esperados a la solicitud de OPCIONES. Lavarlo solo no funcionó, pero me dio una idea. Agregué los encabezados personalizados que de otro modo se agregarían a través de web.config a la respuesta a la solicitud de OPCIONES. Aquí está mi código:
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Headers.Add("Access-Control-Allow-Origin", "https://localhost:44343");
Response.Headers.Add("Access-Control-Allow-Headers",
"Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
Response.Headers.Add("Access-Control-Allow-Credentials", "true");
Response.Flush();
}
}
Obviamente, esto solo se aplica a las solicitudes de OPCIONES. Todos los demás verbos son manejados por la configuración CORS. Si hay un mejor enfoque para esto, soy todo oídos. Me parece una trampa y preferiría que los encabezados se agregaran automáticamente, pero esto es lo que finalmente funcionó y me permitió seguir adelante.
Seguí todos los pasos anteriores indicados por
Mihai-Andrei Dinculescu
.
Pero en mi caso, necesitaba
1
paso
más
porque las OPCIONES http estaban deshabilitadas en la Web. Configure en la línea a continuación.
<remove name="OPTIONSVerbHandler" />
Lo acabo de eliminar de Web.Config (solo coméntelo como se muestra a continuación) y Cors funciona de maravilla
<handlers>
<!-- remove name="OPTIONSVerbHandler" / -->
</handlers>
Si tiene seguridad / requestFiltering nodos en su web.config de la siguiente manera:
<security>
<requestFiltering>
<verbs allowUnlisted="false">
<add verb="GET" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="PUT" allowed="true" />
<add verb="DELETE" allowed="true" />
<add verb="DEBUG" allowed="true" />
</verbs>
</requestFiltering>
asegúrese de agregar esto también
<add verb="OPTIONS" allowed="true" />
Debe habilitar CORS en su API web . La forma más fácil y preferida de habilitar CORS a nivel mundial es agregar lo siguiente en web.config
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
</system.webServer>
Tenga en cuenta que los
métodos
se especifican individualmente, en lugar de usar
*
.
Esto se debe a que se produce un error al usar
*
.
También puede habilitar CORS por código.
Actualizar
Se
requiere el
siguiente paquete
NuGet
:
Microsoft.AspNet.WebApi.Cors
.
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.EnableCors();
// ...
}
}
Luego puede usar el atributo
[EnableCors]
en acciones o controladores como este
[EnableCors(origins: "http://www.example.com", headers: "*", methods: "*")]
O puedes registrarlo globalmente
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var cors = new EnableCorsAttribute("http://www.example.com", "*", "*");
config.EnableCors(cors);
// ...
}
}
También debe manejar las
solicitudes de
Options
verificación previa con
HTTP OPTIONS
solicitudes de
HTTP OPTIONS
.
Web API
debe responder a la solicitud de
Options
para confirmar que está configurada para admitir
CORS
.
Para manejar esto, todo lo que necesita hacer es enviar una respuesta vacía . Puedes hacer esto dentro de tus acciones, o puedes hacerlo globalmente así:
# Global.asax.cs
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Flush();
}
}
Esta verificación adicional se agregó para garantizar que las
APIs
antiguas que fueron diseñadas para aceptar solo solicitudes
GET
y
POST
no sean explotadas.
Imagine enviar una solicitud
DELETE
a una
API
diseñada cuando este
verbo
no existía.
El resultado es
impredecible
y los resultados pueden ser
peligrosos
.