Urg*_*gen 2 c# asp.net-core-mvc asp.net-core asp.net-core-webapi
我无法在 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
}
}
Run Code Online (Sandbox Code Playgroud)
前端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);
}
}
Run Code Online (Sandbox Code Playgroud)
网页控制器:-
[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");
}
Run Code Online (Sandbox Code Playgroud)
网络路由:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "WebRoute",
template: "{controller}/{action}/{id?}",
defaults: new { controller = "Home", action = "Index" },
constraints: new { id = "[0-9]+" });
});
Run Code Online (Sandbox Code Playgroud)
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]+" });
});
Run Code Online (Sandbox Code Playgroud)
有几种可能的解决方案。对于每个解决方案前端部分应调用以下网址
"/api/account/login"
"/api/account/register"
Run Code Online (Sandbox Code Playgroud)
解决方案1
您需要在HttpPost属性 ASP.NET Core 路由中指定模板无法从请求中获取操作名称
[Route("api/[controller]")]
public class AccountController : Controller
{
[HttpPost("Login")]
public async Task<IActionResult> UserLogin(LoginDto user) { /*..*/ }
}
Run Code Online (Sandbox Code Playgroud)
或者您可以将模板与 ActionName
[Route("api/[controller]")]
public class AccountController : Controller
{
[HttpPost("[action]"), ActionName("Login")]
public async Task<IActionResult> UserLogin(LoginDto user) { /*..*/ }
}
Run Code Online (Sandbox Code Playgroud)
解决方案2
更新控制器的路由以包含操作名称
[Route("api/[controller]/[action]")]
public class AccountController : Controller
{
[HttpPost, ActionName("Login")]
public async Task<IActionResult> UserLogin(LoginDto user) { /*..*/ }
}
Run Code Online (Sandbox Code Playgroud)
解决方案3
使用Route属性进行操作
[Route("api/[controller]")]
public class AccountController : Controller
{
[HttpPost, Route("Login")]
public async Task<IActionResult> UserLogin(LoginDto user) { /*..*/ }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5839 次 |
| 最近记录: |