2016-08-29 6 views
2

Я следовал за помощью к ASP.NET Web API Help Pages using Swagger и я получаю следующее сообщение об ошибке в Chrome:ASP.NET Ядро Кураж не работает в Chrome с CORS ошибки

  • Не удается прочитать с сервера. Возможно, у него нет соответствующих настроек источника контроля доступа.

Он работает в IE10, однако, похоже, он не подбирает изменения.

Я нашел следующую запись Can't read swagger JSON from http://localhost:9000/api-docs/, к сожалению, она относится к ее изменению под хрюканьем, когда она теперь работает под глотком.

Я также попытался изменить настройки CORS в ядре ASP.NET:

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddApplicationInsightsTelemetry(Configuration); 

     services.AddMvc(); 

     // Inject an implementation of ISwaggerProvider with defaulted settings applied 
     services.AddSwaggerGen(); 


     services.ConfigureSwaggerGen(options => 
     { 
      options.SingleApiVersion(new Info 
      { 
       Version = "v1", 
       Title = "Status API", 
       Description = "A simple example ASP.NET Core Web API!", 
       TermsOfService = "None", 
       Contact = new Contact { Name = "A Persone", Email = "[email protected]", Url = "http://www.some-company.com/" }, 
       License = new License { Name = "Use under LICX", Url = "http://url.com" } 
      }); 
     }); 

     services.AddCors(options => 
     { 
      options.AddPolicy("AnyOrigin", builder => 
      { 
       builder 
        .AllowAnyOrigin() 
        .AllowAnyMethod(); 
      }); 
     }); 
    } 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     app.UseApplicationInsightsRequestTelemetry(); 

     app.UseApplicationInsightsExceptionTelemetry(); 

     app.UseMvc(); 

     // Enable middleware to serve generated Swagger as a JSON endpoint 
     app.UseSwagger(); 

     // Enable middleware to serve swagger-ui assets (HTML, JS, CSS etc.) 
     app.UseSwaggerUi(); 

     app.UseCors("AnyOrigin"); 

    } 

К сожалению, это не имеет никакого значения.

Предложения о том, как решить эту проблему, изменив настройки глотка или изменения .NET была бы весьма желательны

+0

1. AddCors только добавляет зависимости, это не добавляет к промежуточному. Это то, что вы делаете с UseCors. Вы используете UseCors? 2. Если да, то в чем его конфигурация? 3. Вы запускаете два отдельных приложения на двух разных портах? IE угрожает одной и той же схеме хоста +, но другой порт как таковой, Firefox и Chrome этого не делают. 4 происходит ли это по всем запросам или только по другим запросам? Один из браузеров не отправил предполетную копию перед отправкой запроса, а не dunno, какой из них он был. 5. Вы получаете исключение с сервера? Исключение промежуточного программного обеспечения удаляет заголовки CORS из запроса – Tseng

+0

Я запускаю пользовательский интерфейс swagger на localhost: 8080 и API на localhost: 17237 – Mark

+0

Тогда ваши настройки CORS неверны. Покажите свою политику CORS, которую вы использовали. Как я уже сказал, IE рассматривает разные порты как одно и то же происхождение и не применяет одну и ту же политику происхождения. – Tseng

ответ

1

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

// ConfigureServices 
services.AddCors(options => 
{ 
    options.AddPolicy("AnyOrigin", builder => 
    { 
     builder 
      .AllowAnyOrigin() 
      .AllowAnyMethod(); 
    }); 
}); 

// Configure 
app.UseCors("AnyOrigin"); 
// Register other middleware here, like UseMvc or UseStaticFiles, depending on if you 
// want StaticFiles to be affected by cors or not you put it before or after the UseCors call 

Update

Как упоминалось в предыдущих комментариях, то промежуточное программное выполняются так, как они зарегистрированы. Запрос доходит до вашего контроллера APi до того, как промежуточное ПО Cors когда-либо получит его.

Ваш метод Configure должен выглядеть следующим образом, вместо:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
    loggerFactory.AddDebug(); 

    app.UseApplicationInsightsRequestTelemetry(); 

    app.UseApplicationInsightsExceptionTelemetry(); 

    // it must be placed before UseMvc and before or after 
    // UseStaticFiles, depending on if you want the static files to be 
    // Cors enabled or not 
    app.UseCors("AnyOrigin"); 

    app.UseMvc(); 

    // Enable middleware to serve generated Swagger as a JSON endpoint 
    app.UseSwagger(); 

    // Enable middleware to serve swagger-ui assets (HTML, JS, CSS etc.) 
    app.UseSwaggerUi(); 
} 
+0

Я действительно пробовал делать это до и снова, но я все еще получаю ту же проблему.Я не уверен, что из-за того, что swagger не проходит через одно и то же промежуточное ПО, хотя он работает на том же порту – Mark

+0

Спасибо, что решил проблему :) – Mark

+0

Я также изменил ConfigureServices, чтобы сделать его более безопасным и просто то, что мне нужно для Swagger: services.AddCors (options => { options.AddPolicy ("AllowSpecificOrigin", builder => builder.WithOrigins ("http: // localhost: 8080")); }); – Mark