无法将 http 请求发布到 .Net Core 2.1 Web 项目

Posted

技术标签:

【中文标题】无法将 http 请求发布到 .Net Core 2.1 Web 项目【英文标题】:Unable to post http request to .Net Core 2.1 web project 【发布时间】:2020-01-23 11:00:52 【问题描述】:

目前,我从事 Angular 6 和 .Net Core 2.1 项目。因此,我的 Angular 6 代码在一个项目中,而用于登录身份验证的 .Net Core 2.1 控制器方法在另一个项目中。据我观察,我的两个项目都有不同的本地主机端口号。当我从邮递员那里拨打 Api 电话时,我可以收到结果。但无法将数据从角度服务发布到控制器方法。

现在,我有一个场景可以将登录凭据发布到我的 ValuesController 中的控制器方法。但是每当我将凭据发布到控制器方法时。我收到 HttpErrorResponse

场景 1:

当我的 Angular 6 代码和控制器(SampledataController)方法存在于同一个项目中时,我可以发布请求并成功获得响应。

场景 2 但是当我的 Angular 6 代码在一个项目中并且用于登录身份验证的 .Net Core 2.1 控制器方法在另一个项目中时,我遇到了问题。 即来自 (WebProject)LoginService ----> (Api)ValuesController

LoginService.ts

AuthenticateUser(txtUsername: string, txtPassword: string) 

    this.userRoles.UserName = txtUsername;
    this.userRoles.Password = txtPassword;
    let parameters = new HttpParams().set('txtUsername', txtUsername)
                                     .set('txtPassword', txtPassword);
    let headers = new HttpHeaders();
    headers.append('Content-Type', 'multipart/form-data');
    headers.append('Accept', 'application/json');
    const httpOptions =  headers: headers ;
    return this._httpClient.post(this.base_url + "SampleData/AuthenticateUser/" + txtUsername + "/" + txtPassword , httpOptions);

ValuesController.cs

[Route("[controller]")]
    public class ValuesController : ControllerBase
    

        [Route("[action]/UserName/Password")]
        public ActionResult<IEnumerable<string>> AuthenticateUser(string UserName, string Password)
        
            return new string[]  UserName, Password ;
        

下面是我的解决方案结构

Solution
    --> Angular project
         Components
               --login component
         Services
               --Login service
         Controller
               --SampleDataController

    --> WebApi Project
         --Controller
              -- ValuesController

您能帮我解决这个问题吗,因为我对此完全陌生。 提前致谢!!

【问题讨论】:

【参考方案1】:

在我掌握的信息有限的情况下,我会检查您是否启用了 CORS? (听起来这就是问题所在,因为邮递员不执行预检请求,但您的浏览器执行。除此之外,您可能没有正确管理服务器响应,这就是为什么您得到一个时髦的 404。可能是因为您的 API 正在尝试重定向到不存在的登录页面。

要为所有域启用 CORS,请在启动的配置方法中添加 app.UseCors();

启用 CORS 的文档:

https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.2

【讨论】:

当我的 webApi 方法和 Angular 服务调用出现在同一个项目中时,我能够记录服务器响应并进行调试。但是当 api 方法和服务在不同的项目中时,甚至都无法调试。 这就是我认为您可能没有启用 CORS 的原因。如果 API 和 Angular 项目在同一个项目中具有相同的来源,则浏览器不会发送飞行前请求,因为它们不是交叉来源。一旦您将它们拆分为不同的项目并且它们具有不同的来源,您的请求将从浏览器中失败,除非您在 API 上启用 CORS 使用 app.UserCors() 启用了 cors,但仍面临问题。 您确实需要修复错误处理和服务器响应,以便在尝试调试错误时识别实际问题 404 not found 没有帮助。你登录你的API了吗? ...如果您的 API 和 Angular 应用程序位于不同的端口上,那么如果不启用 CORS,您的请求肯定会失败。

以上是关于无法将 http 请求发布到 .Net Core 2.1 Web 项目的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net Core 6,SPA,端点 - 我无法从 http get 请求调用控制器

将 .Net Core 2.0 和 Angular4 部署到 AWS 后无法发布到 Sqlite 数据库

无法在 ASP.NET Core 1.0 中启用跨域请求 (CORS)

从 Angular 到 Net Core HTTP 404 发布错误

在 ASP.NET Core 中使用 HTTP 标头传播

Angular2 中的 Http PUT 到 .NET Core Web API 提供来自预检请求的 http 401 错误