我正在尝试使用 ASP.NET Core 2.1 使用 [FromQuery]
从查询参数中获取我的 WebAPI 的参数。对于我的一生,我无法弄清楚自己做错了什么。
具体的 Action 是这样的:
[Route("api/[controller]/[action]")]
public class AuthController : Controller
{
[HttpGet]
[Authorize(Roles = "admin")]
public async Task<IActionResult> GenerateCode([FromQuery]string email)
{
if (String.IsNullOrEmpty(email))
return new BadRequestObjectResult(new ApiBadRequestResponse(new string[] { "Email is empty." }));
var result = await _mediator.Send(new CreateAccessCode.Command
{
Email = email
});
if (result.Succeeded)
return new OkObjectResult(new ApiOkResponse(result.Data));
return new BadRequestObjectResult(new ApiBadRequestResponse(result.Errors));
}
}
email
始终为 null,我在函数中放置了一个断点,因此我知道它被调用了。
我发送的请求是这样的:
{{url}}/api/auth/generatecode?email=test
如果我从头开始创建一个新项目,[FromQuery]
似乎有效,我不知道我在做什么不同。该操作正在被调用,但由于第一行总是返回 BadResponse...
我的 startup.cs 函数如下所示:
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddMvcOptions(options =>
{
options.Filters.Add(new ActionValidationFilter());
})
.AddFluentValidation()
.AddJsonOptions(options =>
{
options.SerializerSettings.ContractResolver =
new CamelCasePropertyNamesContractResolver();
})
.AddSessionStateTempDataProvider();
我完全迷路了。这是我在我的 WebAPI 中查找查询参数的第一个操作。所有其他操作都使用 FromBody 并且工作正常。
最佳答案
选项 1)
尝试将您的 [HttpGet]
属性更改为
[HttpGet("GenerateCode/{email}]
如果这样做,您需要从 Controller 的 Route 属性中删除 /[action]
,所以它只是
[Route("api/[controller]")]
选项 2)
或者,在 Startup.cs
中将 app.UseMvc();
更改为
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "api/{controller=Home}/{action=Index}/{id?}");
});
并从 Controller 属性中删除 [Route("api/[controller]/[action]")]
并确保您没有 [ApiController]
属性之一
此解决方案将更改整个项目的路由,因此您必须对所有其他 API Controller 执行相同的操作
选项 3)
第三种解决方案是将 [Route("api/[controller]/[action]")]
更改为
[Route("api/[controller]/[action]/{id?}")]
我已经测试了所有 3 个解决方案,它们都使用 URL {{url}}/api/ControllerName/ActionName?email=test
关于c# - ASP.NET Core 2.1 [FromQuery] 没有获取参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51353999/