Я использую финальные версии .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/clinic (найдите места с "клиническими" в названии)
- /API/места/автозаполнения? Ключевое слово = Клиническое (получите сконденсированный объект Id + Name для местоположений с "клиническими" в названии).
- /API/местоположения/поиск почтовый индекс = 12345 &? Радиус = 20 & имя = Клиническое (получить места в пределах 20 миль от zip 12345 с "клиническими" в названии).
В разделе ниже кода методы 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);
}
Кажется, что не существует много поддержки сообщества в последних версиях этого материала.
EDIT (с ответом)
Просто замените
[Route("autocomplete/{keyword:alpha}", Name = "locationautocomplete")]
с
[Route("autocomplete"), Route("autocomplete/{keyword:alpha}", HttpGet()]
и он отлично работает.