He intentado seguir los pasos en http://enable-cors.org/server_aspnet.html
a mi API RESTful (implementado con ASP.NET WebAPI2) trabajo con el cruce de las solicitudes de origen (CORS Habilitado). No funciona a menos que modifique la web.config.

He instalado WebApi Cors dependencia:

install-package Microsoft.AspNet.WebApi.Cors -ProjectName MyProject.Web.Api

A continuación, en mi App_Start tengo la clase WebApiConfig de la siguiente manera:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var corsAttr = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(corsAttr);

        var constraintsResolver = new DefaultInlineConstraintResolver();

        constraintsResolver.ConstraintMap.Add("apiVersionConstraint", typeof(ApiVersionConstraint));
        config.MapHttpAttributeRoutes(constraintsResolver); 
        config.Services.Replace(typeof(IHttpControllerSelector), new NamespaceHttpControllerSelector(config));
        //config.EnableSystemDiagnosticsTracing(); 
        config.Services.Replace(typeof(ITraceWriter), new SimpleTraceWriter(WebContainerManager.Get<ILogManager>())); 
        config.Services.Add(typeof(IExceptionLogger), new SimpleExceptionLogger(WebContainerManager.Get<ILogManager>()));
        config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler()); 
    }
}

pero después de que me ejecute la aplicación, puedo solicitar un recurso con el Violinista como:
http://localhost:51589/api/v1/persons
y en la respuesta no puedo ver los encabezados HTTP que tengo de ver, tales como:

  • Access-Control-Allow-Methods: POST, PUT, DELETE, GET, OPTIONS
  • Access-Control-Allow-Origin: *

Siento que me falta algún paso? He probado con la siguiente anotación en el controlador:

[EnableCors(origins: "http://example.com", headers: "*", methods: "*")]

Mismo resultado, no CORS habilitado.

Sin embargo, si puedo añadir lo siguiente en mi web.config (incluso sin la instalación de la Redpea.WebApi.Cors de dependencia) funciona:

<system.webServer>

<httpProtocol>
  <!-- THESE HEADERS ARE IMPORTANT TO WORK WITH CORS -->
  <!--
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="POST, PUT, DELETE, GET, OPTIONS" />
    <add name="Access-Control-Allow-Headers" value="content-Type, accept, origin, X-Requested-With, Authorization, name" />
    <add name="Access-Control-Allow-Credentials" value="true" />
  </customHeaders>
  -->
</httpProtocol>
<handlers>
  <!-- THESE HANDLERS ARE IMPORTANT FOR WEB API TO WORK WITH  GET,HEAD,POST,PUT,DELETE and CORS-->
  <!--

  <remove name="WebDAV" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
-->
</handlers>

Cualquier ayuda sería muy apreciada!

Gracias.

  • Yo tenía el mismo problema, pero me decidí a configurar el Access-Control-Allow-Origin encabezado directamente en el controlador: HttpResponseMessage respuesta = new HttpResponseMessage(HttpStatusCode.OK); //añadir algunos comprueba si la respuesta necesaria.Los encabezados.Add(«Access-Control-Allow-Origin», «*»);
InformationsquelleAutor iberodev | 2015-03-13

11 Comentarios

  1. 89

    He creado un reducido proyecto de demostración para usted.

    Usted puede probar el anterior API Enlace de su local de Fiddler para ver las cabeceras. Aquí está una explicación.

    Global.ascx

    Todo lo que esto hace es llamar a la WebApiConfig. No es nada, pero la organización del código.

    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            WebApiConfig.Register(GlobalConfiguration.Configuration);
        }
    }

    WebApiConfig.cs

    El método clave para su aquí es el EnableCrossSiteRequests método. Este es todos que usted necesita hacer. El EnableCorsAttribute es un tiene un ámbito global CORS atributo.

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            EnableCrossSiteRequests(config);
            AddRoutes(config);
        }
    
        private static void AddRoutes(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "Default",
                routeTemplate: "api/{controller}/"
            );
        }
    
        private static void EnableCrossSiteRequests(HttpConfiguration config)
        {
            var cors = new EnableCorsAttribute(
                origins: "*", 
                headers: "*", 
                methods: "*");
            config.EnableCors(cors);
        }
    }

    Los Valores De Controlador De

    La Get método recibe el EnableCors atributo que se aplicó a nivel mundial. El Another método reemplaza el mundial EnableCors.

    public class ValuesController : ApiController
    {
        //GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { 
                "This is a CORS response.", 
                "It works from any origin." 
            };
        }
    
        //GET api/values/another
        [HttpGet]
        [EnableCors(origins:"http://www.bigfont.ca", headers:"*", methods: "*")]
        public IEnumerable<string> Another()
        {
            return new string[] { 
                "This is a CORS response. ", 
                "It works only from two origins: ",
                "1. www.bigfont.ca ",
                "2. the same origin." 
            };
        }
    }

    Web.config

    Usted no necesita añadir nada especial en la web.config. De hecho, esto es lo que la demo de la web.config parece – es vacío.

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    </configuration>

    Demo

    JS:

    var url = "https://cors-webapi.azurewebsites.net/api/values"
    
    $.get(url, function(data) {
      console.log("We expect this to succeed.");
      console.log(data);
    });
    
    var url = "https://cors-webapi.azurewebsites.net/api/values/another"
    
    $.get(url, function(data) {
      console.log(data);
    }).fail(function(xhr, status, text) {
      console.log("We expect this to fail.");
      console.log(status);
    });

    HTML:

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    • Le gustaba esta solución. Hay un equivalente de la solución para WCF basado servicio restful.
    • Probablemente hay una manera de hacer todo en WCF que podemos hacer en la Web de la API. Dicho esto, se va a tomar mucho más de la configuración y el código para implementar un servicio RESTful con WCF. La API de Web fue diseñado específicamente para el DESCANSO, mientras que WCF es mucho más extensible, flexible y diseñado más para el JABÓN. Véase también: stackoverflow.com/questions/9348639/wcf-vs-asp-net-web-api
    • He seguido todos los pasos de su respuesta y a partir de aquí: asp.net/web-api/overview/security/…. Probado varias combinaciones y nada permite CORS, excepto para el Web.config-><customHeaders> cosas como en la pregunta. Estoy utilizando la última generación de paquetes (igual que en la pregunta). Alguna sugerencia de donde buscar el problema? Esencialmente, por alguna razón esto no resuelve el mismo problema para mí.
    • «Se fija». Por alguna razón se establece CORS encabezados en la producción (en real IIS), pero no en localhost, cuando corría de VisualStudio. No sé por qué, supongo que es condicional de alguna manera.
    • En mi local de IIS, aparte tengo aplicaciones con diferentes números de puerto. Shaun solución no funciona sin la Web.Config parche hasta que….Me di cuenta de que Shaun utiliza "*" de los orígenes en WebApiConfig. Así que me puse el "*" en el origen de la EnableCorsAttribute en el controlador y ahora funciona sin el WebConfig. Mi lectura de cómo especificar los Orígenes me llevó a creer que el número de puerto no era válido, pero yo no detectar que el «*» estaba bien. También, la mayoría de los ejemplos de la llamada config.EnableCors(cors); sin el parámetro. por ejemplo: enable-cors.org/server_aspnet.html)
    • Después de perder 3 horas tratando de conseguir que funcione simplemente he añadido el 3 de encabezados a la web de configuración para realmente conseguir que esto funcione, stackoverflow.com/a/21458845/286121
    • Bummer. Me pregunto por qué una situación que requiere de las cabeceras, mientras que el otro no. Hmm. Me dejan saber si alguna vez determinar el por qué.
    • Esto no funciona para mí. He probado con comodín y dominio especificado, pero no funcionó.
    • Este solutiondoes no trabajo para mí, incluso en @ShaunLuttin demo server no me sale CORS encabezados, consulte dl.dropboxusercontent.com/u/85292167/forever/CORS.png
    • ¿El vinculado Violín trabajar para usted? También, el /another ruta de acceso que usted está usando sólo funciona a partir de dos orígenes, por lo que esperamos que no funcionara a menos que seas la solicitud de uno de los dos orígenes.
    • Creo que me equivoqué y no acttually trabajo. Parece que el marco comprueba el origen y envía el encabezado SÓLO cuando el origen está en la lista de los permitidos orígenes. Cuando el origen no está en la lista, el marco no envía ninguna de cabecera (y yo erróneamente interpretado esto como un mal comportamiento, porque yo estaba esperando a ver permitió origen en el encabezado de cualquier respuesta). Voy a probar este y el informe de los resultados.
    • Esta solución funcionó para mí también. Gracias @Shaun para la colocación de un código fuente.
    • [EnableCors(origins: "http://localhost:64, http://medmy, http://localhost:190", headers: "*", methods: "*")] funciona bien, pero tan pronto como puedo agregar un subsitio que hace [EnableCors(origins: "http://localhost:64, http://medmy, http://localhost:190, http://medmy/mysubsite", headers: "*", methods: "*")] la llamada a la API no funciona. Es una de SharePoint sub sitio, por lo que debe seguir http://medmy, incluso a pesar de que la llamada proviene de http://medmy/mysubsite?
    • No terminar ninguna de sus origins con un final /. Esto me sorprendió en una implementación cuando se estaba trabajando bien localmente.

  2. 14

    Se necesita cambiar algunos archivos. Esto funciona para mí.

    Global.ascx

    public class WebApiApplication : System.Web.HttpApplication {
        protected void Application_Start()
        {
            WebApiConfig.Register(GlobalConfiguration.Configuration);
        } }

    WebApiConfig.cs

    Todas las solicitudes tienen que llamar a este código.

    public static class WebApiConfig {
        public static void Register(HttpConfiguration config)
        {
            EnableCrossSiteRequests(config);
            AddRoutes(config);
        }
    
        private static void AddRoutes(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "Default",
                routeTemplate: "api/{controller}/"
            );
        }
    
        private static void EnableCrossSiteRequests(HttpConfiguration config)
        {
            var cors = new EnableCorsAttribute(
                origins: "*", 
                headers: "*", 
                methods: "*");
            config.EnableCors(cors);
        } }

    Algunos Controlador De

    Nada a cambio.

    Web.config

    Usted necesita para agregar controladores en su web.config

    <configuration> 
      <system.webServer>
        <handlers>
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <remove name="OPTIONSVerbHandler" />
          <remove name="TRACEVerbHandler" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>   
      </system.webServer> 
    </configuration>
    • finalmente, mi problema era el webconfig
    • Esto debe ser aceptado respuesta
    • La config que el cambio hizo el truco para mí.. he tenido : quitar controladores ExtensionlessUrlHandler-ISAPI-4.0_32bit ExtensionlessUrlHandler-ISAPI-4.0_64bit ExtensionlessUrlHandler-Integrado-4.0 WebDAV y agregar controladores ExtensionlessUrlHandler-ISAPI-4.0_32bit ExtensionlessUrlHandler-ISAPI-4.0_64bit ExtensionlessUrlHandler-Integrado-4.0….. Esto provocó que no trabaje.. la cambio por esta respuesta fija. gracias
  3. 12

    En caso de CORS de solicitud de todos los navegadores modernos responder con una OPCIÓN verbo y, a continuación, la solicitud real de la siguiente manera a través. Esto se supone que se utiliza para solicitar al usuario la confirmación en caso de un CORS solicitud. Pero en el caso de una API si desea omitir este proceso de verificación agregar el siguiente fragmento de código Global.asax

            protected void Application_BeginRequest(object sender, EventArgs e)
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
                if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
                {
                    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE");
    
                    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
                    HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
                    HttpContext.Current.Response.End();
                }
            }

    Aquí estamos justo al pasar la verificación mediante la comprobación de las OPCIONES de verbo.

    • Gracias, no es que http de configuración de nivel de lo que la dependencia de Microsoft.AspNet.WebApi.Cors debe ocuparse, así que no es necesario configurar de forma expresa en nuestro código? Puedo tener trabajo por hacer algo similar en la web.configuración, pero el punto es el uso de Microsoft.AspNet.WebApi.Cors a tratar con él y tiene atributos configurables.
    • No está seguro de por qué se quiere omitir el proceso de verificación de la totalidad. Al menos no en la producción. Si desea utilizar el construido en lo que fue diseñado puede configurar CORS correctamente y, a continuación, ignorar el enrutamiento de las OPCIONES de las solicitudes como se detalla en mi respuesta
    • Si usted encuentra que IE trabaja, mientras que Chrome y Firefox falla, esta muy bien ser la solución. A mí me funcionó en un entorno de desarrollo.
    • Después de probar varias docenas de maneras, esta es la única cosa que hizo el trabajo. Es todavía aceptable y un método seguro?
  4. 8

    Acabo de añadir cabeceras personalizadas a la Web.config y trabajó como un encanto.

    Sobre la configuración del sistema.servidor web:

    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
      </customHeaders>
    </httpProtocol>

    Tengo el front-end de la aplicación y el backend en la misma solución. Para que esto funcione, necesitas los servicios de la web del proyecto (Backend) como el valor predeterminado para este trabajo.

    Yo estaba usando Resto, no he probado con otra cosa.

    • Sólo por esta solucionar el problema para mí. Gracias hombre!!!
    • Como otros han dicho, la pérdida de tiempo en tratar de conseguir que funcione «correctamente», a continuación, sólo la metieron en la web.config
    • Gracias @Mathter, esto funcionó para mí, a pesar de habilitar CORS a través de mi clase de inicio. La pregunta es, sin embargo, ¿por qué estamos teniendo para establecer esta en la web.config en lugar de hacerlo de la forma habitual?
  5. 3

    Después de algunas modificaciones en mi Web.config CORS de repente dejó de funcionar en mi Web API 2 del proyecto (al menos para la solicitud de OPCIONES durante la comprobación preliminar). Parece que usted necesita para tener la sección se mencionan a continuación en su Web.config o de lo contrario el (global) EnableCorsAttribute no funcionará en las OPCIONES de las solicitudes. Tenga en cuenta que esta es exactamente la misma sección de Visual Studio se añade una nueva API de Web 2 del proyecto.

    <system.webServer>
      <handlers>
        <remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
        <remove name="OPTIONSVerbHandler"/>
        <remove name="TRACEVerbHandler"/>
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
      </handlers>
    </system.webServer>
  6. 2

    Ninguna de estas respuestas realmente el trabajo. Como otros señalaron el Cors paquete de sólo usar el Access-Control-Allow-Origin encabezado caso de que la solicitud tuvo un Origen de encabezado. Pero usted no puede, generalmente, sólo tiene que añadir un Origen de encabezado de la solicitud debido a que los navegadores pueden tratar de regular también.

    Si quieres una forma rápida y sucia para permitir que la cruz de solicitudes de sitio web de la api, es realmente mucho más fácil escribir un filtro personalizado atributo:

    public class AllowCors : ActionFilterAttribute
    {
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            if (actionExecutedContext == null)
            {
                throw new ArgumentNullException("actionExecutedContext");
            }
            else
            {
                actionExecutedContext.Response.Headers.Remove("Access-Control-Allow-Origin");
                actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
            }
            base.OnActionExecuted(actionExecutedContext);
        }
    }

    A continuación, sólo lo utilizan en su acción de Controlador:

    [AllowCors]
    public IHttpActionResult Get()
    {
        return Ok("value");
    }

    No voy a responder por la seguridad de esto en general, pero es probablemente mucho más seguro que la configuración de los encabezados en la web.config ya que de esta manera se puede aplicar sólo como específicamente como usted los necesita.

    Y, por supuesto, es fácil de modificar el anterior para permitir que sólo determinados orígenes, métodos, etc.

    • No creo que este trabaja en la depuración de Visual Studio situación. Parece que este código no está siendo alcanzado, debido a que Visual Studio IIS está comiendo la solicitud antes de este código, incluso.
  7. 1

    He tenido este mismo problema, tratando de habilitar CORS a nivel mundial. Sin embargo, me enteré de que hace trabajo, sin embargo, sólo cuando la solicitud contenga una Origin el valor del encabezado. Si se omite el origin valor de encabezado, la respuesta no contiene una Access-Control-Allow-Origin.

    He utilizado un plugin de chrome llamada DHC a prueba mi petición GET. Esto me permitió agregar el Origin encabezado fácilmente.

  8. 1

    WEBAPI2:SOLUCIÓN.
    global.asax.cs:

    var cors = new EnableCorsAttribute("*", "*", "*");
    config.EnableCors(cors);

    EN el explorador de soluciones, haga clic con el api-proyecto. En
    ventana propiedades, establezca ‘la Autenticación Anónima’ a Habilitado !!!

    La esperanza de que esto ayude a alguien en el futuro.

    • No hay config en el mundial.asax.cs.
    • Debe ser WebApiConfig.cs, dentro de Registrar()
  9. 1

    Nadie de seguro de la solución de trabajo para mí, así es más seguro que Neeraj y más fácil de Mateo acaba de agregar:
    System.Web.HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

    En el controlador del método. Que trabajan para mí.

    public IHttpActionResult Get()
    {
        System.Web.HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
        return Ok("value");
    }
    • He utilizado el CORS de la biblioteca y poner el atributo en un controlador, pero no funcionó. Solo lo utiliza a nivel mundial dentro de WebApiConfig lo hizo el trabajo. El uso de esta solución en última instancia, trabajó para mí por el controlador de base. Gracias.
  10. 0

    He encontrado esta pregunta porque yo estaba teniendo problemas con las OPCIONES de solicitud de la mayoría de los navegadores enviar. Mi aplicación fue de enrutamiento de las OPCIONES de las solicitudes y el uso de mi Coi para la construcción de un montón de objetos y algunos estaban lanzando excepciones en este extraño tipo de solicitud, por diversas razones.

    , Básicamente, poner en una ignorar ruta para todas las OPCIONES de las peticiones que se le están causando problemas:

    var constraints = new { httpMethod = new HttpMethodConstraint(HttpMethod.Options) };
    config.Routes.IgnoreRoute("OPTIONS", "{*pathInfo}", constraints);

    Más info: Parar la Web de la API de OPCIONES de procesamiento de las solicitudes de

  11. 0

    La esperanza de que esto ayude a alguien en el futuro. Mi problema era que yo estaba siguiendo el mismo tutorial de como el OP para habilitar global de CORS. Sin embargo, también se establece una Acción específica de CORS de la regla en mi AccountController.cs archivo:

    [EnableCors(origins: "", headers: "*", methods: "*")]

    y estaba recibiendo errores sobre el origen no puede ser null o una cadena vacía. PERO el error que estaba sucediendo en el Mundial.asax.cs archivo de todos los lugares. La solución es cambiar a:

    [EnableCors(origins: "*", headers: "*", methods: "*")]

    aviso de la * en los orígenes? Falta que era lo que estaba causando el error en el Mundial.asax.cs archivo.

    Espero que esto ayude a alguien.

Dejar respuesta

Please enter your comment!
Please enter your name here