首页 > 解决方案 > 角度应用程序中的请求返回状态 400

问题描述

我正在尝试向 asp.net 核心后端发送一个发布请求以验证输入名称,但得到状态 400 错误请求。

这是控制器:

[Route("api/masterdata/general/companies")]
[ApiController]
public class CompanyController : Controller
{
    private DataContext DataContext;

    public CompanyController(DataContext dataContext)
    {
        DataContext = dataContext;
    }

    [HttpGet("{id}")]
    public Company GetCompany(long Id)
    {
        return DataContext.Companies.Find(Id);
    }

    [HttpGet]
    public IEnumerable<Company> GetCompanies()
    {
        return DataContext.Companies;
    }

    [HttpPost("validatename/{name}")]
    public JsonResult ValidateName(string name)
    {
        IEnumerable<Company> companies = DataContext.Companies;

        bool isValid = !companies.Any(c => Common.CleanName(c.Name) == Common.CleanName(name));

        return Json(isValid);
    }
}

这是角度应用程序中相应的服务调用:

  validateName(name: string): Observable<any> {
    return this.http.post<boolean>("api/masterdata/general/companies/validatename/" + name, null);
  }

为什么得到我不好的要求?GetCompaniesapi调用已达到并且工作正常。

谢谢。

标签: angularasp.net-core-webapi

解决方案


问题是,我在ConfigureServices方法中注册了防伪令牌功能:

services.AddAntiforgery(options => { options.HeaderName = "X-XSRF-TOKEN"; });

但是我忘记将防伪令牌添加到来自 Angular 的请求中,如下所示:

    app.Use(nextDelegate => context =>
    {
        string path = context.Request.Path.Value;
        string[] directUrls = { "/masterdata" };
        if (path.StartsWith("/api") || string.Equals("/", path) || directUrls.Any(url => path.StartsWith(url)))
        {
            var tokens = antiforgery.GetAndStoreTokens(context);
            context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions()
            {
                HttpOnly = false,
                Secure = false,
                IsEssential = true
            });
        }
        return nextDelegate(context);
    });

现在,它可以工作了(状态 200)。


推荐阅读