我正在尝试使用[FromQuery]
通过ASP.NET Core 2.1从查询参数中获取WebAPI的参数。对于我的一生,我无法弄清楚自己在做错什么。
特定操作如下:
[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并正常工作。
答案 0 :(得分:4)
选项1)
尝试将您的[HttpGet]
属性更改为
[HttpGet("GenerateCode/{email}]
如果这样做,您将需要从控制器的Route属性中删除/[action]
,因此就可以了
[Route("api/[controller]")]
选项2)
或者,在Startup.cs
中将app.UseMvc();
更改为
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "api/{controller=Home}/{action=Index}/{id?}");
});
然后从控制器属性中删除[Route("api/[controller]/[action]")]
,并确保您也没有[ApiController]
属性
此解决方案将更改整个项目的路由,因此您必须对所有其他API控制器执行相同的操作
选项3)
第三种解决方案是将[Route("api/[controller]/[action]")]
更改为
[Route("api/[controller]/[action]/{id?}")]
我已经测试了所有3个解决方案,它们都带有URL {{url}}/api/ControllerName/ActionName?email=test
答案 1 :(得分:1)
答案稍晚,但可能对其他人有帮助
选项4
您可以在[FromQuery]属性中明确命名querystring参数名称
[HttpGet]
[Authorize(Roles = "admin")]
public async Task<IActionResult> GenerateCode([FromQuery(Name="email")] string email)
{
}