【问题标题】:Need help identifying why route segment not found需要帮助确定找不到路线段的原因
【发布时间】:2021-06-05 06:24:16
【问题描述】:

我正在编写一个 .net core 3.1 web api,但遇到了基本路由段的问题。当我尝试将我的“id”作为段传递时,我得到了 404 未找到的条件。

例如服务器名称/api/contacts/getsmscontactlist/3

这是我的 startup.cs:

    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();

    app.UseCors("AllowAllHeaders");

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(name: "MainAPIRouteForGet",
                pattern: "api/{controller}/{action}/{id?}");

        endpoints.MapControllerRoute(name: "default",
                    pattern: "{controller=Home}/{action=Index}");
    });

这是我的控制器:

[ApiController]
[Route("api/[controller]")]
[EnableCors("AllowAllHeaders")]
public class ContactsController : ControllerBase
{
private readonly IContactManager _contactManager;
private readonly IConfiguration _configuration;

public ContactsController(IContactManager contactManager, IConfiguration config)
{
    _contactManager = contactManager ?? throw new ArgumentNullException(nameof(contactManager));
    _configuration = config;
}

[HttpGet("{id}:int")]
[Route("getsmscontactlist")]
public ActionResult GetSmsContactsForAccount(int id)
{
    var smsRecipientsViewModel = _contactManager.GetSmsContactsForAccount(id);

    if (smsRecipientsViewModel.Any())
    {
        return Ok(smsRecipientsViewModel);
    }

    return NotFound("No SMS contacts found");

}

【问题讨论】:

    标签: asp.net-mvc asp.net-core routes


    【解决方案1】:

    这是出错的地方:

    //NOTE: this is incorrect, the correct pattern should be {id:int}
    [HttpGet("{id}:int")]
    [Route("getsmscontactlist")]
    public ActionResult GetSmsContactsForAccount(int id)
    

    您为该方法使用了 2 个属性(每个属性都可以指定一个路由模式)。这将创建两条路线{id:int}getsmscontactlist。第二条路由根本无法通过路由值绑定id,而第一条路由可以绑定id 值但缺少有意义的段。使用这些路由,测试 url 将类似于servername/api/contacts/3(匹配第一个路由)或servername/api/contacts/getsmscontactlist?id=3(匹配第二个路由)。

    但是看起来你只想使用一个路由,所以它应该是这样的:

    [HttpGet("getsmscontactlist/{id:int}")]
    public ActionResult GetSmsContactsForAccount(int id)
    

    现在您可以使用原来的测试网址:servername/api/contacts/getsmscontactlist/3

    【讨论】:

    • 非常非常感谢。我实际上看到它与“...?id = 3”一起使用并且对此感到困惑,但不想混淆这个问题。我真诚地感谢你的回答。 JK,你的科技界人士。
    • @JoeKehnast 不客气,请随时接受答案,否则它看起来没有帮助(不突出)。
    • NP King King。我在这个论坛上没有问很多问题,所以忘了这样做。再次感谢我的朋友。你的代码,JK。
    • @JoeKehnast 好的,请注意,在没有接受或赞成的情况下提出太多问题可能被视为没有贡献。那时您可能无法提出更多要求,直到您给出答案以做出更多贡献....这就是 SO 的工作原理。但现在你知道了。如果可以,请继续提问和回答,谢谢!
    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    相关资源
    最近更新 更多