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