[英]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.