gpt4 book ai didi

c# - WebApi 2.0 路由与查询参数不匹配?

转载 作者:太空狗 更新时间:2023-10-30 00:14:51 25 4
gpt4 key购买 nike

我刚刚从 AttributeRouting 切换到 WebApi 2.0 AttributeRouting,并且有一个 Controller 和 Action 定义如下:

public class InvitesController : ApiController
{
[Route("~/api/invites/{email}")]
[HttpGet]
[ResponseType(typeof(string))]
public IHttpActionResult InviteByEmail(string email)
{
return this.Ok(string.Empty);
}
}

示例查询:

GET: http://localhost/api/invites/test@foo.com

我收到的响应是 200,内容为空(由于 string.Empty)。


一切正常——但我想将电子邮件属性更改为查询参数。所以我将 Controller 更新为:

public class InvitesController : ApiController
{
[Route("~/api/invites")]
[HttpGet]
[ResponseType(typeof(string))]
public IHttpActionResult InviteByEmail(string email)
{
return this.Ok(string.Empty);
}
}

但是现在查询端点时:

GET: http://localhost/api/invites?email=test@foo.com

我收到的响应是 404:

{
"message": "No HTTP resource was found that matches the request URI 'http://localhost/api/invites?email=test@foo.com'.",
"messageDetail": "No route providing a controller name was found to match request URI 'http://localhost/api/invites?email=test@foo.com'"
}

有谁知道为什么当参数被交换为查询参数而不是内联 url 时它与路由不匹配?


根据要求,WebApiConfig 定义如下:

public static void Register(HttpConfiguration config)
{
var jsonFormatter = config.Formatters.JsonFormatter;
jsonFormatter.Indent = true;
jsonFormatter.SerializerSettings.ContractResolver = new RemoveExternalContractResolver();

config.MapHttpAttributeRoutes();
}

谢谢!

最佳答案

我认为您需要在路由中包含查询参数(及其类型),如下所示:

[Route("api/invites/{email:string}")]

使用它会是

POST: http://localhost/api/invites/test@foo.com

或者,如果您想命名查询参数:

[Route("api/invites")]

将使用它(只要您的方法中有电子邮件参数)

POST: http://localhost/api/invites?email=test@foo.com

正如您在 edhedges 回答中评论的那样:路线模板不能以“/”或“~”开头,因此您可以像上面那样从 route 删除它

关于c# - WebApi 2.0 路由与查询参数不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19956974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com