更新: 即使我在 webapi 中对 program.cs 进行硬编码以始终设置 Access-Control-Allow-Origin 标头,但在使用 OPTIONS/POST 请求调用 api 时也不会设置标头。
因此,为了排除在调用 webapi 时托管 webapi 的服务器“外部”存在某些防火墙,我打开了服务器的远程桌面并在本地浏览我的 Web 应用程序。这应该使场景与我在开发机器上时“相同”。不幸的是,同样的事情发生了。除 GET 之外的所有类型的调用均“被 cors 策略阻止”。这让我抓狂,难道是网站上的任何配置阻止了某些呼叫?
请参阅下面的硬编码标头,即使在我的开发计算机上运行我的 webapp 和 webapi 时它仍然工作得很好:
app.Use(async (ctx, next) =>
{
var org = ctx.Request.Headers["Origin"];
if (!string.IsNullOrWhiteSpace(org) && allowedOrigins.Contains(org))
{
ctx.Response.Headers.Append("Access-Control-Allow-Origin", org);
}
ctx.Response.Headers.Append("Access-Control-Allow-Credentials", "true");
if (HttpMethods.IsOptions(ctx.Request.Method))
{
ctx.Response.Headers.Append("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS, PATCH");
ctx.Response.Headers.Append("Access-Control-Allow-Headers", "content-type");
await ctx.Response.CompleteAsync();
return;
}
await next();
});
我以为我了解如何为 .net 框架 webapi 配置 cors,但我不明白这个。
我有一个 vue/vuetify 网站和一个在同一服务器上运行的 .net Framework 8 webapi 网站。当然,在我的开发计算机上会出现错误,因为在开发人员的计算机上一切都工作正常。
但是,在我们的测试服务器上安装网站时,我们收到一个似乎与 cors 相关的错误。但是所有“GET”调用都工作正常,但没有 POST/PATCH 请求工作。 Chrome 控制台中记录的错误如下:
从源“https://crmappdev1:8051”访问“https://crmappdev1:8050/api/generic/getAnyServiceCarisma”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。
在我的 webapi 中设置 CORS 时,我尽可能减少限制,允许所有方法和标头,但仍然没有成功。我注意到的唯一区别是,如果我不指定“AllowAnyMethod”,则所有调用都会失败,但如果我说“.AllowAnyMethod”或指定允许哪些方法,则“GET”开始工作,但所有其他类型都会失败。我发现了许多文章描述了如何在 Program.cs 中为 webapi 链接设置的顺序,并且我已经尝试了所有方法,但显然我遗漏了一些东西。如果有任何解决此问题的建议,我将不胜感激。
chrome 网络选项卡中 POST 的结果,正如您所看到的,在执行 POST 请求时它显示“未经授权”和“选项”,我认为这是一个提示,但我不知道该怎么做:
我的 Program.cs 的当前版本如下。在我的本地开发计算机上运行良好,但在服务器上安装时运行不佳:
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
List<string> allowedOrigins = new List<string>
{
"http://localhost:8080",
"http://localhost:8051",
// DEV ENV
"http://crmappdev1:8051",
"https://crmappdev1:8051"
};
builder.Services.AddCors(
options =>
{
options.AddDefaultPolicy(
policy =>
{
policy.WithOrigins(allowedOrigins.ToArray())
//.AllowAnyMethod()
//.WithMethods("GET", "PUT", "POST", "DELETE", "OPTIONS")
//.AllowAnyHeader()
//.AllowCredentials()
;
}
);
});
builder.Configuration
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();
builder.Services.AddAuthorization(options =>
{
// By default, all incoming requests will be authorized according to the default policy.
options.FallbackPolicy = options.DefaultPolicy;
});
builder.Services.AddMvc(option => option.EnableEndpointRouting = false).AddNewtonsoftJson();
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
app.UseCors(
builder =>
{
builder
.WithOrigins(allowedOrigins.ToArray())
.AllowAnyHeader()
.AllowCredentials()
.WithMethods("GET", "PUT", "POST", "DELETE", "OPTIONS", "PATCH")
//.AllowAnyMethod()
;
});
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
}
你的答案是你的错误。
来源“https://crmappdev1.xxx.xxx.se:8051”已被 CORS 策略阻止
您需要添加
https://crmappdev1.xxx.xxx.se:8051
作为允许的来源