Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Blazor无法连接到ASP.NET核心WebApi(CORS)_C#_Asp.net Core_Cors_Blazor_Blazor Webassembly - Fatal编程技术网

C# Blazor无法连接到ASP.NET核心WebApi(CORS)

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

我有一个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 {
    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());
    });