如何在我的 ASP.NET 核心 WebApi 项目中全局启用 CORS
Posted
技术标签:
【中文标题】如何在我的 ASP.NET 核心 WebApi 项目中全局启用 CORS【英文标题】:How to enable CORS globally in my ASP.NET core WebApi project 【发布时间】:2016-12-12 03:32:33 【问题描述】:我正在尝试将我的 Web Api2 迁移到 ASP.NET 核心 Web api 项目。在我的项目中,我们使用的是 EnableCors 功能。
我在 Microsoft 网站上找到了这份文档,我将其用作参考 - https://docs.asp.net/en/latest/security/cors.html
正如“在 MVC 中启用 CORS”部分所述,我正在尝试像这样在 ConfigureServices 方法中全局启用 cors -
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(Microsoft.Extensions.DependencyInjection.IServiceCollection, System.Action)'
在此处参考错误屏幕截图 - ERROR scrrenshot
谁能告诉我?
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" ]
【问题讨论】:
我怀疑你混淆了依赖关系。发布您的 project.json,可能您的依赖项之一正在获取选项库的过时/不同版本 @Tseng 添加了 project.json 告诉你,"Microsoft.AspNet.Cors": "6.0.0-rc1-final" That's an outdated package.
"Microsoft.AspNetCore.Cors": "1.0.0"` 是正确的
【参考方案1】:
您混淆了依赖项。
“Microsoft.AspNet.Cors”:“6.0.0-rc1-final”
是一个非常旧的版本,导致您的解决方案加载了具有相同命名空间和类型的两个不同程序集,并且编译器不知道要使用哪个程序集。
改成
“Microsoft.AspNetCore.Cors”:“1.0.0”
所有Microsoft.AspNet.*
软件包都非常旧,不应使用。他们都用 RC2 重命名为Microsoft.AspNetCore.*
【讨论】:
我没有意识到...我指的是旧文档。谢谢你:) 知道在哪里可以参考正确的文档步骤以在我的 ASP.NET 核心 WebApi 项目中全局启用 cors 吗? Api 自 rc1 以来应该没有变化,但您可以随时查看 github 示例或类似情况,使用常识或查看使用的示例,即此处的音乐商店示例:github.com/aspnet/MusicStore/tree/1.0.0/src/MusicStore。事实上,您甚至不需要显式添加依赖项,因为它已经被Microsoft.AspNetCore.Mvc
包 github.com/aspnet/Mvc/blob/1.0.0/src/Microsoft.AspNetCore.Mvc/… 引用
嗨 @Tseng 再问一个关于 CORS 的问题(如果我需要提出新问题,请告诉我)我已经在 webapi 中全局启用了 CORS。在启动时添加这个块 - services.AddCors(options => options.AddPolicy("AllowSpecificOrigin", builder => builder.WithOrigins("http://localhost:3000")); );
并用 [EnableCors("AllowSpecificOrigin")]
属性标记控制器。当我从 Angular2 应用程序发送 GET 请求时,它可以正常工作,但 POST 不能。我在这里有什么遗漏吗?
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.
【参考方案2】:
Asp.Net 文档说:
要为您的应用程序设置 CORS,请将 Microsoft.AspNetCore.Cors 包添加到您的项目中。 在 Startup.cs 中添加 CORS 服务:
public void ConfigureServices(IServiceCollection services)
services.AddCors();
要为您的整个应用程序启用 CORS,请使用 UseCors
将 CORS 中间件添加到您的请求管道中
扩展方法。请注意,CORS 中间件必须位于应用中您希望支持跨域请求的任何已定义端点之前(例如,在任何对 UseMvc
的调用之前)。
您可以在使用 CorsPolicyBuilder 类添加 CORS 中间件时指定跨域策略。使用 lambda 调用 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!");
);
【讨论】:
以上是关于如何在我的 ASP.NET 核心 WebApi 项目中全局启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章
需要一些帮助来构建 asp.net 核心 webapi 中的 [HttpPost] 部分
如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?
如何使用角度修改 asp.net 核心 WebAPI 的 asp.net 身份 UI
如何在 asp.net 核心 webapi 控制器中读取请求正文?