Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web API 2路由属性不工作_C#_Asp.net_Asp.net Mvc 4_Asp.net Web Api_Asp.net Web Api Routing - Fatal编程技术网

C# Web API 2路由属性不工作

C# Web API 2路由属性不工作,c#,asp.net,asp.net-mvc-4,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net,Asp.net Mvc 4,Asp.net Web Api,Asp.net Web Api Routing,我使用的是.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, [...]

我使用的是.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(获取名称中带有“clinical”的位置)
  • /api/locations/autocomplete?关键字=临床 (为名称中带有“clinical”的位置获取压缩Id+名称对象)
  • /api/locations/search?zipcode=12345&radius=20&name=clinical (获取zip 12345 20英里内的位置,名称中带有“临床”)
在下面的代码块中,
Get
方法和
Search
可以根据需要工作,但是
Autocomplete
不能。应该注意的是,我在多个控制器中有类似的命名方法。我做错了什么?(还有,
Name=
属性的确切含义是什么?)


它工作得非常完美。

您是否正在尝试对搜索和自动完成操作执行GET请求?如果是,则需要使用
System.Web.Http.HttpGet
属性进行修饰。如果动作的前缀不是Get、Put、Post、Delete等动词,则默认情况下,WebAPI假定为Post。我猜你收到了一个405方法是不允许的,对吧


Name属性在生成链接(
Url.link
)时非常有用,您需要指定一个名称

谢谢!!我将
[Route(“autocomplete/{keyword:alpha}”,Name=“locationautocomplete”)]
更改为
[Route(“autocomplete”),Route(“autocomplete/{keyword:alpha}”),HttpGet()
,现在它工作得很好。
HttpGet()
属性是关键,将两个
Route()
定义链接在一起可以使它以我想要的两种不同方式工作。
/// <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()]