簡體   English   中英

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

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

我無法在 ASP.NET Core 中處理我的路由規則。 我有以下用戶身份驗證操作方法的后端和前端應用程序。 由於這兩種操作方法在有效載荷中都有一個參數不同或附加參數。 Http 客戶端實際上無法導航精確的方法,因此拋出一個錯誤“歧義”的異常,這是真的,因為這兩個 HttpPost 方法都有一個帶有不同參數的參數。 如何確保該方法根據操作觸發。 代碼如下:-

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
        }
  }

前端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);
                }
      }

網頁控制器:-

     [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");


}

網絡路由:

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

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]+" });
            });

有幾種可能的解決方案。 對於每個解決方案前端部分應調用以下網址

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

解決方案1

您需要在HttpPost屬性中指定模板 ASP.NET Core 路由無法從請求中獲取操作名稱

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

或者您可以將模板與ActionName結合使用

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

解決方案2

更新控制器的路由以包含操作名稱

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

解決方案3

使用Route屬性進行操作

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

使用 apiController 屬性和 ControllerBase

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

網址應該是這樣的

var uri = "…………/api/賬戶/登錄"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM