繁体   English   中英

Web API 2路由属性不起作用

[英]Web API 2 routing attributes not working

我正在使用.NET 4.5的最终版本和Web API 2(在Visual Studio 2013中)。 我一直在使用这个文档作为参考,但无济于事。

我有几条基本路线

api/providers
api/locations
api/specialties

并且每个方法都有类似的

Get()
Get(int id)
Get(string keyword)
Autocomplete(string keyword)
Search(string zipcode, string name, int radius, [...])

理想情况下,我希望URL最终会像

  • / api / locations / 12345 (获取位置12345)
  • / api / locations / clinical (获取名称中带有“临床”的位置)
  • / api / locations / autocomplete?keyword = clinical (获取名称中带有“clinical”的位置的精简Id + Name对象)
  • / api / locations / search?zipcode = 12345&radius = 20&name = clinical (获取位于邮编12345之内20英里内的位置,名称中带有“临床”)

在下面的代码块中, Get方法和Search可以根据需要工作,但Autocomplete不会。 应该注意的是,我在多个控制器中有类似的命名方法。 我究竟做错了什么? (另外, Name =属性究竟是什么?)

/// <summary>
/// This is the API used to interact with location information.
/// </summary>
[RoutePrefix("api/locations")]
public class LocationController : ApiController
{
    private ProviderEntities db = new ProviderEntities();

    private static readonly Expression<Func<Location, LocationAutocompleteDto>> AsLocationAutocompleteDto =
        x => new LocationAutocompleteDto
        {
            Id = x.Id,
            Name = x.Name
        };

    /// <summary>
    /// Get ALL locations.
    /// </summary>
    [Route("")]
    public IQueryable<Location> Get()
    {
        return db.Locations.AsQueryable();
    }

    /// <summary>
    /// Get a specific location.
    /// </summary>
    /// <param name="id">The ID of a particular location.</param>
    [Route("{id:int}")]
    public IQueryable<Location> Get(int id)
    {
        return db.Locations.Where(l => l.Id == id);
    }

    /// <summary>
    /// Get all locations that contain a keyword.
    /// </summary>
    /// <param name="keyword">The keyword to search for in a location name.</param>
    [Route("{keyword:alpha}")]
    public IQueryable<Location> Get(string keyword)
    {
        return db.Locations.Where(l => l.Name.Contains(keyword)).OrderBy(l => l.Name);
    }

    [Route("search", Name = "locationsearch")]
    public string Search(string zipcode = null, string latitude = null, string longitude = null)
    {
        if (zipcode != null) return "zipcode";
        if (latitude != null && longitude != null) return "lat/long";
        else
            return "invalid search";
    }

    /// <summary>
    /// Autocomplete service for locations, returns simple Id/Name pairs.
    /// </summary>
    /// <param name="keyword">The keyword to search on.</param>
    [Route("autocomplete/{keyword:alpha}", Name = "locationautocomplete")]
    public IQueryable<LocationAutocompleteDto> Autocomplete(string keyword)
    {
        // validate the inputs
        if (string.IsNullOrEmpty(keyword))
            return null;

        IQueryable<Location> results = from l in db.Locations
                                       where l.Name.Contains(keyword)
                                       select l;

        return results.Select(AsLocationAutocompleteDto);
    }

这个东西的最新版本似乎没有很多社区支持。

编辑(带答案)

简单地更换

[Route("autocomplete/{keyword:alpha}", Name = "locationautocomplete")]

[Route("autocomplete"), Route("autocomplete/{keyword:alpha}", HttpGet()]

它完美无缺。

您是否尝试对搜索和自动完成操作执行GET请求? 如果是,那么您需要使用System.Web.Http.HttpGet属性进行装饰。 如果某个操作没有像Get,Put,Post,Delete等动词作为前缀,则默认情况下Web API会假定为POST。 我猜你正在接受405方法不允许......正确吗?

在链接生成( Url.Link )的情况下,Name属性非常有用,您需要在其中指定名称

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM