C# Blazor无法连接到ASP.NET核心WebApi(CORS)
我有一个ASP.NET核心服务器在本地IP上运行C# Blazor无法连接到ASP.NET核心WebApi(CORS),c#,asp.net-core,cors,blazor,blazor-webassembly,C#,Asp.net Core,Cors,Blazor,Blazor Webassembly,我有一个ASP.NET核心服务器在本地IP上运行https://192.168.188.31:44302使用Web API Enpoints。 我可以用VS代码REST客户端连接到上述服务器。 现在我想使用运行在https://192.168.188.31:5555 我的Blozor代码: @page "/login" @inject HttpClient Http [ ... some "HTML"-Code ... ] @code { pr
https://192.168.188.31:44302
使用Web API Enpoints。
我可以用VS代码REST客户端连接到上述服务器。
现在我想使用运行在https://192.168.188.31:5555
我的Blozor代码:
@page "/login"
@inject HttpClient Http
[ ... some "HTML"-Code ... ]
@code {
private async Task Authenticate()
{
var loginModel = new LoginModel
{
Mail = "some@mail.com",
Password = "s3cr3T"
};
var requestMessage = new HttpRequestMessage()
{
Method = new HttpMethod("POST"),
RequestUri = ClientB.Classes.Uris.AuthenticateUser(),
Content =
JsonContent.Create(loginModel)
};
var response = await Http.SendAsync(requestMessage);
var responseStatusCode = response.StatusCode;
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine("responseBody: " + responseBody);
}
public async void LoginSubmit(EditContext editContext)
{
await Authenticate();
Console.WriteLine("Debug: Valid Submit");
}
}
当我现在触发LoginSubmit
时,我在Chrome和Firefox的开发者控制台中收到以下错误消息:login:1访问获取https://192.168.188.31:44302/user/authenticate“起源”https://192.168.188.31:5555'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“Access Control Allow Origin”标头。如果不透明响应满足您的需要,请将请求的模式设置为“无cors”,以获取禁用cors的资源。
我是web开发新手,发现您必须在服务器端ASP.NET核心项目上启用CORS,因此我扩展了startup.cs
readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<UserDataContext, UserSqliteDataContext>();
services.AddCors(options =>
{
options.AddPolicy(name: MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("https://192.168.188.31:44302",
"https://192.168.188.31:5555",
"https://localhost:44302",
"https://localhost:5555")
.AllowAnyHeader()
.AllowAnyMethod();
});
});
services.AddControllers();
services.AddApiVersioning(x =>
{
...
});
services.AddAuthentication(x =>
...
});
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
services.AddScoped<IViewerService, ViewerService>();
}
public void Configure(IApplicationBuilder app,
IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
Program.IsDevelopment = env.IsDevelopment();
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseCors(MyAllowSpecificOrigins);
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
Log.Initialize();
}
只读字符串MyAllowSpecificCorigins=“\u MyAllowSpecificCorigins”;
public void配置服务(IServiceCollection服务)
{
services.AddDbContext();
services.AddCors(选项=>
{
options.AddPolicy(名称:MyAllowSpecificCorigins,
生成器=>
{
建筑商。来源(“https://192.168.188.31:44302",
"https://192.168.188.31:5555",
"https://localhost:44302",
"https://localhost:5555")
.AllowAnyHeader()
.AllowAnyMethod();
});
});
services.AddControllers();
services.addapVersioning(x=>
{
...
});
services.AddAuthentication(x=>
...
});
AddAutoMapper(AppDomain.CurrentDomain.GetAssemblys());
services.addScope();
}
公共无效配置(IApplicationBuilder应用程序,
IWebHostEnvironment(环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
Program.IsDevelopment=env.IsDevelopment();
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
应用程序UseCors(MyAllowSpecificCorigins);
app.UseEndpoints(端点=>
{
endpoints.MapControllers();
});
Log.Initialize();
}
但我仍然收到上面的错误消息。
我是否在配置CORS时出错?
为什么VS Code REST客户端能按预期工作?Blazor WASM应用程序中的调用怎么会出错?我不确定默认设置是什么,但请使用显式设置进行尝试:
options.AddPolicy(name: MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("https://192.168.188.31:44302",
"https://192.168.188.31:55555",
"https://localhost:44302",
"https://localhost:55555")
.AllowAnyHeader()
.AllowAnyMethod();
});
导致错误消息的问题
login:1获取的访问权限'https://192.168.188.31:44302/user/authenticate“起源”https://192.168.188.31:5555'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在'access control Allow Origin'标头。如果不透明响应满足您的需要,请将请求的模式设置为“无cors”,以获取禁用cors的资源。
是由httpsredition
引起的
要解决此问题,请通过删除行app.UseHttpsRedirection()来停用HttpsRedirection
在函数中配置
或在函数配置服务
中添加适当的重定向端口(推荐方式)
在我的例子中,我在端口44302
启动我的WebAPI,因此我的解决方案如下所示(您必须使其适应您的端口号):
还请注意,向CORS添加请求API的IP地址就足够了,如下所示:
services.AddCors(options =>
{
options.AddPolicy(name: specificOrigins,
builder =>
{
builder.WithOrigins("https://192.168.188.31:5555",
"http://192.168.188.31:5444")
.AllowAnyHeader()
.AllowAnyMethod();
});
});
步骤1:请在WebAPI的Startup.cs中添加以下代码,以允许具有特定来源的COR:
services.AddCors(options =>
{
options.AddDefaultPolicy(builder =>
builder.WithOrigins("https://localhost:44351")
.AllowAnyHeader()
.AllowAnyMethod());
});
第二步:现在改变”https://localhost:44351“在上面的代码中使用blazor web程序集应用程序的URL。请参阅下面的屏幕截图:
步骤3:现在在WebAPI的Configure方法中,在app.UseRouting()之后和app.UseRouting()之前添加app.UseCors()。请参阅下面的屏幕截图:
我也面临同样的问题,它解决了我的问题。希望它也能为你工作
注意:修复上述问题不需要更改Blazor web程序集代码。您正在服务器上配置CORS,对吗?代码形式不清楚。是的,最后一段代码摘录自我的服务器端ASP.NET核心项目的文件startup.cs
。我是否还需要配置其他东西(或更多)?configure()方法对添加项目的顺序很敏感,最好发布完整版本。在你的with origin中,你有:55555(5x5)错误,它声明:5555(4x5),这只是一个输入错误吗?@CobyC你的眼光很好,正确的端口是5555-我修复了它,但还是一样的错误我试过了,但是仍然会收到错误消息login:1访问获取'https://192.168.188.31:44302/user/authenticate“起源”https://192.168.188.31:5555'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在'access control Allow Origin'标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源。
是,将UseCors()放在UseAuth*()之前。我将其放在UseRouting()下面。
,仍然没有更改。还有什么我能做的吗?也许我做了一些根本错误的事情?Ik看起来基本正常,我无法发现错误。也许是DIY的HttpRequest信息。查找工作示例并比较注释。更新:该问题是由于错误颁发的证书造成的(IP地址不是备用DNS名称)。现在一切都正常了。一开始我错过了“使用blazor web程序集应用程序的URL”。当然,这是一个不同的端口号。一旦我输入了呼叫blazor应用程序的地址,它就工作得很好。@DickdeReus很高兴知道它为您工作。谢谢你的评论。
services.AddCors(options =>
{
options.AddDefaultPolicy(builder =>
builder.WithOrigins("https://localhost:44351")
.AllowAnyHeader()
.AllowAnyMethod());
});