简体   繁体   English

ASP.NET Core Webb API 中的多个 HttpPost 方法

[英]Multiple HttpPost Method in ASP.NET Core Webb API

I could not head around on my routing rules in ASP.NET Core.我无法在 ASP.NET Core 中处理我的路由规则。 I have following Back and Front-end application of user authentication action methods.我有以下用户身份验证操作方法的后端和前端应用程序。 Since both of these action methods has one parameter with different or additional arguments in payload.由于这两种操作方法在有效载荷中都有一个参数不同或附加参数。 Http client could not actually navigate exact method therefore throw an exception with an error "ambiguity" and it is true because both these HttpPost method has one parameter with different arguments. Http 客户端实际上无法导航精确的方法,因此抛出一个错误“歧义”的异常,这是真的,因为这两个 HttpPost 方法都有一个带有不同参数的参数。 How to make sure that method triggers according to action.如何确保该方法根据操作触发。 Code follows :-代码如下:-

API Controller:- API控制器:-

  [Route("api/[controller]")]
  public class AccountController: Controller
  {
         [HttpPost, ActionName("Login")]
         public async Task<IActionResult> UserLogin(LoginDto user)
         {
            //Code goes here
         }

        [HttpPost, ActionName("Register")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> UserRegistration(RegisterDto register)
        {
             //Code goes here
        }
  }

Frontend API Service前端API服务

   public async Task<IActionResult> GetLoginAsync(LoginDto loginUser)
   {
                var request = "/api/account";
                var content = new StringContent(JsonConvert.SerializeObject(loginUser), Encoding.UTF8, "application/json");
                try
                {
                    var result = await ExecuteWithResiliencePolicies(() => _client.PostAsync(request, content));
                    return new StatusCodeResult((int)result.StatusCode);

                }
                catch (HttpRequestException)
                {
                    return new StatusCodeResult(StatusCodes.Status503ServiceUnavailable);
                }           
     }

     public async Task<IActionResult> PostRegistrationAsync(RegisterDto registerUser)
     {
                var request = "/api/account";
                var content = new StringContent(JsonConvert.SerializeObject(registerUser), Encoding.UTF8, "application/json");
                try
                {
                    var result = await ExecuteWithResiliencePolicies(() => _client.PostAsync(request, content));
                    return new StatusCodeResult((int)result.StatusCode);

                }
                catch (HttpRequestException)
                {
                    return new StatusCodeResult(StatusCodes.Status503ServiceUnavailable);
                }
      }

Web Controller :-网页控制器:-

     [HttpPost, ActionName("Login")]
            [ValidateAntiForgeryToken]
            public async Task<IActionResult> UserLogin(LoginDto user)
            {
                SetCorrelation();
                if (!ModelState.IsValid)
                {
                    return RedirectToAction(nameof(Login));
                }
                await _accountService.GetLoginAsync(user);              
                return RedirectToAction("Index", "Home");
            }

            [HttpPost, ActionName("Register")]
            [ValidateAntiForgeryToken]
            public async Task<IActionResult> UserRegistration(RegisterDto register)
            {
                SetCorrelation();
                if (!ModelState.IsValid)
                {
                    return RedirectToAction(nameof(Login));
                }
                await _accountService.PostRegistrationAsync(register);
                return RedirectToAction("Index", "Home");


}

Web Routing :网络路由:

app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "WebRoute",
                    template: "{controller}/{action}/{id?}",
                    defaults: new { controller = "Home", action = "Index" },
                    constraints: new { id = "[0-9]+" });                
            });

API Routing:- API 路由:-

app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "KtsWebAPIRoute",
                    template: "{controller=Posts}/{action=GetAsync}/{id?}");

                routes.MapRoute(
                    name: "KtsAccountRoute",
                    template: "{controller}/{action}/{id?}",
                    defaults: new { controller = "Account", Action = "Login" },
                    constraints: new { id = "[0-9]+" });
            });

There are couple of possible solutions.有几种可能的解决方案。 For every solution front-end part should call the following urls对于每个解决方案前端部分应调用以下网址

"/api/account/login"
"/api/account/register"

Solution 1解决方案1

You need to specify template in HttpPost attribute ASP.NET Core routing cannot get action name from request您需要在HttpPost属性中指定模板 ASP.NET Core 路由无法从请求中获取操作名称

[Route("api/[controller]")]
public class AccountController : Controller
{
    [HttpPost("Login")]
    public async Task<IActionResult> UserLogin(LoginDto user) { /*..*/ }
}

or you can combine template with ActionName或者您可以将模板与ActionName结合使用

[Route("api/[controller]")]
public class AccountController : Controller
{
    [HttpPost("[action]"), ActionName("Login")]
    public async Task<IActionResult> UserLogin(LoginDto user) { /*..*/ }
}

Solution 2解决方案2

Update route for controller to include action name as well更新控制器的路由以包含操作名称

[Route("api/[controller]/[action]")]
public class AccountController : Controller
{
    [HttpPost, ActionName("Login")]
    public async Task<IActionResult> UserLogin(LoginDto user) { /*..*/ }
}

Solution 3解决方案3

Use Route attributes for actions使用Route属性进行操作

[Route("api/[controller]")]
public class AccountController : Controller
{
    [HttpPost, Route("Login")]
    public async Task<IActionResult> UserLogin(LoginDto user) { /*..*/ }
}

Use apiController attribute and ControllerBase使用 apiController 属性和 ControllerBase

[ApiController]
[Route("api/[controller]/[action]")]
public class AccountController : ControllerBase
{
.....
}

and the url should look like this网址应该是这样的

var uri = "............/api/Account/Login" var uri = "…………/api/账户/登录"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 带有charset1252的ASP.NET Core Web API HttpPost - ASP.NET Core Web API HttpPost with charset1252 为什么我的 HttpPost 方法没有从我的 Asp.Net Core Razor 页面触发? - Why is my HttpPost method not firing from my Asp.Net Core Razor page? 使用 HttpPost 方法提交表单后,ASP.NET Core 重定向到同一页面 - ASP.NET Core redirecting to the same page after submitting a form with HttpPost method 选定的复选框未显示在 asp.net core mvc 3.1 的 HttpPost 操作方法中 - Selected Checkboxes are not showing up in the HttpPost action method in asp.net core mvc 3.1 长时间运行的超时 ASP.NET MVC Core Controller HTTPPost 方法 - Timeouts with long running ASP.NET MVC Core Controller HTTPPost Method ASP.NET Core MVC model 参数值在 HttpPost 方法中变为 null - ASP.NET Core MVC model argument values becoming null in HttpPost method ASP.Net Core 3.1:控制器方法总是从 HttpPost 调用接收 NULL 参数 - ASP.Net Core 3.1: Controller method always recieves NULL parameter from HttpPost call "ASP.NET Web App CORE:未调用控制器中的 HttpPost 编辑方法" - ASP.NET Web App CORE: the HttpPost Edit Method in Controller not being called 用于上传图像的 Asp.Net Core HttpPost API 导致无法获得任何响应 - Asp.Net Core HttpPost API for Upload Image results in Could not get any response 如何避免循环引用asp.net core mvc [HttpPost(&quot;add-recipe&quot;)] web api - How to avoid the circular referencing asp.net core mvc [HttpPost("add-recipe")] web api
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM