2017-02-13 1 views
3

Я решил эту проблему после того, как не нашел решение для Stackoverflow, поэтому я делюсь своей проблемой здесь и решением в ответе.Включить заголовок OPTIONS для CORS на веб-интерфейсе .NET Core

После включения политики перекрестного домена в моем приложении .NET Core Web Api с помощью AddCors он по-прежнему не работает в браузерах. Это связано с тем, что браузеры, включая Chrome и Firefox, сначала отправят запрос OPTIONS, и мое приложение просто ответит с помощью 204 No Content.

+0

Что такое конкретный сценарий, где это не удается? Если это «все время не работает для любого браузера Chrome/ff, делающего CORS», то как это не распространяется уже на фреймворк? Похоже, это было бы довольно огромным упущением. – ssmith

+0

Согласен. Однако так оно и есть. Структура позволит вам делать CORS со встроенными функциями, но не обрабатывает вызовы OPTIONS, и это требование для нормального использования междоменных вызовов api из браузеров. Тем не менее, вы можете избежать этого, сделав более простой вызов, например, тип установки для текста/plain и несколько других вещей. Затем браузер сначала не будет выполнять вызов OPTIONS. –

ответ

6

Добавить класс промежуточного программного обеспечения в проект для обработки ОПЦИИ глагол.

using System.Threading.Tasks; 
using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Http; 
using Microsoft.AspNetCore.Hosting; 

namespace Web.Middlewares 
{ 
    public class OptionsMiddleware 
    { 
     private readonly RequestDelegate _next; 
     private IHostingEnvironment _environment; 

     public OptionsMiddleware(RequestDelegate next, IHostingEnvironment environment) 
     { 
      _next = next; 
      _environment = environment; 
     } 

     public async Task Invoke(HttpContext context) 
     { 
      this.BeginInvoke(context); 
      await this._next.Invoke(context); 
     } 

     private async void BeginInvoke(HttpContext context) 
     { 
      if (context.Request.Method == "OPTIONS") 
      { 
       context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { (string)context.Request.Headers["Origin"] }); 
       context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Accept" }); 
       context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" }); 
       context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" }); 
       context.Response.StatusCode = 200; 
       await context.Response.WriteAsync("OK"); 
      } 
     } 
    } 

    public static class OptionsMiddlewareExtensions 
    { 
     public static IApplicationBuilder UseOptions(this IApplicationBuilder builder) 
     { 
      return builder.UseMiddleware<OptionsMiddleware>(); 
     } 
    } 
} 

Затем добавить app.UseOptions(); это в качестве первой линии в Startup.cs в методе Настройка.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    app.UseOptions(); 
} 
+0

Я сделал эту точную вещь и могу получить запрос на попадание промежуточного ПО, но он возвращает «Запрошенный URL-адрес не может быть достигнут Услуга может быть временно недоступна или, возможно, она переместилась на новый веб-адрес. [ошибка в хром-соке]: ошибка соединения была связана с ошибкой TCP (RST). Что я делаю неправильно? – crackedcornjimmy

+0

Не знаю. Чтобы устранить неполадки, я открывал Fiddler и проверял детали запроса и ответа. –

+3

+1, но нужно что-то отрегулировать, не называть _next.Invoke, если метод - это параметры, запрос должен заканчиваться после вызова 'context.Response.WriteAsync (« OK »);', поэтому измените реализацию 'Invoke' на be: 'if (context.Request.Method! =" OPTIONS ") { wait this._next.Invoke (контекст); } ' –

0

Я знаю, что было дан ответ. Просто отвечая обновленной информацией. Так что это поможет другим.

Теперь он встроен в основу ядра asp.net.

Просто следуйте https://docs.microsoft.com/en-us/aspnet/core/security/cors

и заменить

app.UseCors(builder => 
    builder.WithOrigins("http://example.com")); 

с

 app.UseCors(builder => 
     builder.WithOrigins("http://example.com") 
       .AllowAnyHeader() 
       .AllowAnyMethod() 
       .AllowCredentials()); 
Смежные вопросы