ASP.NET Core中间件

3

我已经构建了自定义身份中间件。在调用方法内部,我会检查请求是否具有令牌等信息。在检查令牌后,我想将请求传递给控制器。对于GET请求,它可以跳转到控制器方法。但是对于POST请求则无法正常工作。

这是调用方法:

public async Task Invoke(HttpContext context)
{
    //checking
    await _next(context);
}

它的工作控制器:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET api/values
    [AllowAnonymous]
    [HttpGet]
    public string Get()
    {
        return "Allow annymous";
    }
 }

而不是一个工作的

[Route("api/[controller]")]
public class AccountController : Controller
{
    [AllowAnonymous]
    [HttpPost]
    public void Login()
    {
         //some logic
          HttpContext.Response.WriteAsync("Unauthorized");
    }
}

使用Postman进行POST调用时返回404错误。

你肯定正在向 /api/Account 发送 POST 请求? - juunas
这个控制器中还有其他的POST方法吗? - Developer
3个回答

1
该操作的路由为/api/Account。请确保正确。
如果您需要的是/api/Account/Login
[Route("api/[controller]/[action]")]
public class AccountController : Controller
{
    [AllowAnonymous]
    [HttpPost]
    public void Login()
    {
         //some logic
          HttpContext.Response.WriteAsync("Unauthorized");
    }
}

0
看了你的代码,我希望在 AccountController 中只有一个叫做 Login 的方法。如果不是,请给 Login 方法添加属性 [Route("Login")] (确保不要像 [Route("Login")] 这样保持空白,否则它将与您当前正在进行的操作相同)。
然后调用POST http://host:***/api/account/login url,应该可以工作。
FYI:我已经在我的机器上尝试过这个东西,它可以工作。

0

尝试返回类似于 IActionResult 的东西,而不仅仅是 void。

[AllowAnonymous]
[HttpPost]
public IActionResult Login() 
{
    // some logic
    return Unauthorized();
}

你可以尝试移除[AllowAnonymous],看看是否存在相同的问题?同时,尝试在类级别上添加一个特定的路由,比如[Route("api/foo")],并针对"api/foo"进行POST请求,看看是否能够得到响应。 - Alexander Staroselsky
你是如何执行POST请求的?URL长什么样子?你是否添加了任何头部信息或者在startup.cs中设置了防止POST请求的限制,比如身份验证限制? - Alexander Staroselsky
我正在使用默认的控制器值进行操作,现在通过Postman进行操作,没有任何中间件或其他东西,它返回500,关键是我可以检查到真正的错误。 - miechooy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接