【问题标题】:Issue with attribute based routing not working基于属性的路由问题不起作用
【发布时间】:2020-11-08 14:29:21
【问题描述】:

我遇到了基于属性的路由无法正常工作的问题。我已经设置了我的前缀 (http://localhost:6600/api/camps/ATL2018/talks),如下所示,并设置了默认路由,它似乎工作正常。

namespace TheCodeCamp.Controllers
{
    [RoutePrefix("api/camps/{moniker}/talks")]
    public class TalkController : ApiController

    {
        private readonly ICampRepository _repositiry;
        private readonly IMapper _mapper;

        public TalkController(ICampRepository repository, IMapper mapper)
        {
            _repositiry = repository;
            _mapper = mapper;

        }

        [Route()]
        public async Task<IHttpActionResult> Get(string moniker, bool includeSpeakers = false)
        {
            try 
            {
                var results = await _repositiry.GetTalksByMonikerAsync(moniker, includeSpeakers);

                return Ok(_mapper.Map<IEnumerable<TalkModel>>(results));
            }
            catch (Exception ex)
            {
                return InternalServerError(ex);
            }

        }

        [Route("{id:int}")]
        public async Task<IHttpActionResult> Get(string moniker,int id, bool includeSpeakers)
        {

            try 
            {
                var result = await _repositiry.GetTalkByMonikerAsync(moniker, id, includeSpeakers);
                if (result == null) return NotFound();

                return Ok(_mapper.Map<TalkModel>(result));
            }

            catch(Exception ex)
            {
                return InternalServerError(ex);

            }

        }

    }
}

这个问题是当我运行下面的 URL 时它返回 Not Found

 http://localhost:6600/api/camps/ATL2018/talks/1

有一个关于 Id 1 的会谈,问题似乎是它甚至没有达到[Route("{id:int}")],因为我设置了一个断点,它返回 Not Found 而没有达到断点。

任何建议将不胜感激。

【问题讨论】:

  • 参数列表与输入不匹配。在 C# 中,像 Get 这样的方法可以有多个具有不同数量参数的方法。所以它没有进入方法,因为参数与您定义的方法不同。

标签: c# asp.net-web-api routes


【解决方案1】:

在您的第二个 Get 中,您的参数 includeSpeakers 未在您的 Route 中提供,并且未设置为可选。 我不确定您的问题是否来自那里,但我认为您定义第二个端点的方式可能会导致路由问题,因为您没有提供所有输入参数。

[Route("{id:int}")]
public async Task<IHttpActionResult> Get(string moniker,int id, bool includeSpeakers = false)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 2013-06-01
    • 2014-12-27
    • 2016-01-06
    • 1970-01-01
    • 2018-04-30
    • 2014-03-25
    相关资源
    最近更新 更多