Проблема CORS в Web Api с несколькими методами HttpPost - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть контроллер, созданный с шаблоном WebApi по умолчанию.Он создает один метод записи, подобный этому:

    // POST: api/PedidosVenta
    [HttpPost]
    [ResponseType(typeof(PedidoVentaDTO))]
    public async Task<IHttpActionResult> PostPedidoVenta(PedidoVentaDTO pedido)

В это время CORS работал нормально с моего компьютера и из разных доменов.Затем мне понадобился второй метод сообщения с другим маршрутом, и я создал его следующим образом:

    [HttpPost]
    [EnableCors(origins: "*", headers: "*", methods: "POST")]
    [Route("api/PedidosVenta/SePuedeServirPorAgencia")]
    public async Task<RespuestaAgencia> SePuedeServirPorAgencia(PedidoVentaDTO pedido)

Он отлично работает на моем компьютере, даже когда я вызываю этот метод, но когда я пытаюсь запустить из другогодомен, он выдает ошибки CORS (только когда я вызываю этот метод, все остальные работают нормально).

Я не могу решить эту проблему, поэтому я уверен, что упускаю что-то важное.Кто-нибудь может мне помочь правильно настроить cors в этом методе, пожалуйста?

Спасибо

ОБНОВЛЕНИЕ: Я вставляю код WebApiConfig:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
        config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;

        config.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

        var cors = new System.Web.Http.Cors.EnableCorsAttribute(
        origins: "*",
        headers: "*",
        methods: "*");
        config.EnableCors(cors);

        GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}

1 Ответ

0 голосов
/ 06 февраля 2019

Этот код в 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", "GET, 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();
    }
}

Из 405 опции метода не разрешены в asp.net web api controller?

Тогда ятакже пришлось удалить CORS из WebApiConfig.cs, потому что он был дубликатом и выдал другую ошибку: The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed

...