Как включить CORS глобально в моем проекте WebApi ядра ASP.NET

Я пытаюсь перенести свой Web Api2 в проект ASP.NET core web api. В моем проекте мы используем функции EnableCors.

Я нашел этот документ на сайте Microsoft, который использую в качестве справочника - https://docs.asp.net/en/latest/security/cors.html

Как упоминалось в разделе «Включение CORS в MVC», я пытаюсь включить cors глобально с помощью метода ConfigureServices следующим образом:

services.Configure<MvcOptions>(options =>
            {
                options.Filters.Add(new CorsAuthorizationFilterFactory("AllowSpecificOrigin"));
            });

Однако я получаю эту ошибку, которую не мог понять -

Вызов неоднозначен для следующих методов или свойств: Microsoft.Extensions.DependencyInjection.OptionsServiceCollectionExtensions.Configure (Microsoft.Extensions.DependencyInjection.IServiceCollection, System.Action) и Microsoft.Extensions.DependencyInjection.OptionsServiceCollectionExtensions.Configure .DependencyInjection.IServiceCollection, System.Action) '

См. Снимок экрана с ошибкой здесь - ERROR scrrenshot

Может ли кто-нибудь сообщить мне, как включить CORS глобально в моем проекте WebApi ядра ASP.NET?

Project.json:

{
  "userSecretsId": "aspnet5-MVC6",
  "version": "1.4.0-*",
  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "dependencies": {
    "Microsoft.ApplicationInsights.AspNetCore": "1.0.0",
    "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0",
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "1.0.0",
    "Microsoft.AspNetCore.Identity": "1.0.0",
    "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",
    "Microsoft.AspNetCore.Mvc": "1.0.0",
    "Microsoft.AspNetCore.Mvc.TagHelpers": "1.0.0",

    "Microsoft.AspNet.Cors": "6.0.0-rc1-final",

    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0",
    "Microsoft.EntityFrameworkCore": "1.0.0",
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
    "Microsoft.Extensions.Configuration.CommandLine": "1.0.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0"
  },

  "tools": {
    "BundlerMinifier.Core": "2.0.238",
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final",
    "Microsoft.Extensions.SecretManager.Tools": "1.0.0-preview2-final"
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dnxcore50"
      ],
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.0"
        }
      }
    },
    "net461": {
      "dependencies": {
        "Microsoft.VisualStudio.Web.CodeGenerators.Mvc": "1.0.0-preview2-final"
      }
    }
  },

  "publishOptions": {
    "exclude": [
      "**.user",
      "**.vspscc",
      "wwwroot",
      "node_modules"
    ]
  },

  "scripts": {
    "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ]
  }
}

person Sameer Pawar    schedule 05.08.2016    source источник
comment
Я подозреваю, что вы перепутали зависимости. Опубликуйте свой project.json, вероятно, одна из ваших зависимостей извлекает устаревшую / другую версию библиотеки параметров.   -  person Tseng    schedule 05.08.2016
comment
@Tseng Добавлен project.json   -  person Sameer Pawar    schedule 05.08.2016
comment
Сказал я, "Microsoft.AspNet.Cors": "6.0.0-rc1-final" That's an outdated package. Microsoft.AspNetCore.Cors: 1.0.0` правильный   -  person Tseng    schedule 05.08.2016


Ответы (2)


Вы перепутали зависимости.

«Microsoft.AspNet.Cors»: «6.0.0-rc1-final»

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

Измените это на

«Microsoft.AspNetCore.Cors»: «1.0.0»

Все Microsoft.AspNet.* пакеты очень старые и не должны использоваться. Все они были переименованы в Microsoft.AspNetCore.* с RC2

person Tseng    schedule 05.08.2016
comment
Я не понимал ... Я имел в виду старую документацию. Спасибо :) - person Sameer Pawar; 05.08.2016
comment
любая идея, где я могу сослаться на правильные шаги в документации, чтобы включить cors глобально в моем основном проекте WebApi ASP.NET? - person Sameer Pawar; 05.08.2016
comment
Api должен быть неизменным, начиная с rc1, но вы всегда можете посмотреть примеры github или, как в этом случае, использовать здравый смысл или посмотреть на используемые образцы, например образец музыкального магазина здесь: github.com/aspnet/MusicStore/tree/1.0.0/src/MusicStore. Фактически, вам даже не нужно явно добавлять зависимость, потому что на нее уже есть ссылка в Microsoft.AspNetCore.Mvc package github.com/aspnet/Mvc/blob/1.0.0/src/Microsoft.AspNetCore.Mvc/ - person Tseng; 05.08.2016
comment
Привет, @Tseng, еще один вопрос относительно CORS (пожалуйста, дайте мне знать, если мне нужно поднять новый вопрос). Я включил CORS глобально в webapi. Добавьте этот блок в автозагрузку - services.AddCors(options => { options.AddPolicy("AllowSpecificOrigin", builder => builder.WithOrigins("http://localhost:3000")); }); и отметьте контроллер атрибутом [EnableCors("AllowSpecificOrigin")]. Когда я отправляю запрос GET из приложения Angular2, он работает нормально, а POST - нет. Я что-то упустил? - person Sameer Pawar; 07.08.2016
comment
Запрос POST вызывает эту ошибку - Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. - person Sameer Pawar; 07.08.2016
comment
Новый вопрос должен быть лучше с более подробной информацией, есть несколько причин, скорее всего, в вашем коде выбрано исключение, и промежуточное ПО для исключения очищает все заголовки, установленные из других промежуточных программ, до того, как возникло исключение, или вы можете попытаться добавить .AllowAnyMethod();, также см. stackoverflow.com/a/37141865/455493 - person Tseng; 07.08.2016
comment
POST работает после добавления AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); Еще раз спасибо, и я подниму новый вопрос в будущем. - person Sameer Pawar; 07.08.2016

В документации Asp.Net говорится:

Чтобы настроить CORS для вашего приложения, добавьте в проект пакет Microsoft.AspNetCore.Cors. Добавьте службы CORS в Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
      services.AddCors();
}

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

Вы можете указать политику перекрестного происхождения при добавлении промежуточного программного обеспечения CORS с помощью класса CorsPolicyBuilder. вызовите UseCors с лямбдой:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
     loggerFactory.AddConsole();
     if (env.IsDevelopment())
     {
        app.UseDeveloperExceptionPage();
     }
     // Shows UseCors with CorsPolicyBuilder.
     app.UseCors(builder =>
     builder.WithOrigins("http://example.com").AllowAnyMethod().AllowAnyHeader());
     app.Run(async (context) =>
     {
          await context.Response.WriteAsync("Hello World!");
     });
 }
person Kalyan    schedule 20.02.2017