Ich verwende die endgültigen Release-Versionen von .NET 4.5 und Web API 2 (in Visual Studio 2013). Ich habe this documentation als Referenz verwendet, ohne Erfolg.Web-API-2-Routingattribute funktionieren nicht
Ich habe ein paar Basis Routen wie
api/providers
api/locations
api/specialties
Und einige Methoden auf jeder wie
Get()
Get(int id)
Get(string keyword)
Autocomplete(string keyword)
Search(string zipcode, string name, int radius, [...])
Im Idealfall würde ich die URLs wie wie am Ende
- /api/locations/12345 (Standort 12345)
- /api/locations/klinische (get Standorte mit "klinischen" im Namen)
- /api/locations/automatische Vervollständigung? Keyword = klinische (ein kondensiertes Id + Namen Objekt für Standorte mit „klinischen erhalten "im Namen)
- /api/Orte/search? zipcode = 12345 & Radius = 20 & name = klinischen (get Standorte innerhalb von 20 Meilen von Zip-12345 mit "klinischen" im Namen)
In dem Codeblock unten funktionieren die Get
Methoden und Search
wie gewünscht, aber Autocomplete
nicht. Es sollte beachtet werden, dass ich ähnliche Methoden in mehreren Controllern benannt habe. Was mache ich falsch? (Auch, was genau ist die Name =
Eigenschaft für?)
/// <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);
}
Es gibt nicht viel Unterstützung der Gemeinschaft zu sein scheint rund um die neuesten Versionen dieses Zeug noch.
EDIT (mit Antwort)
ersetzt einfach
[Route("autocomplete/{keyword:alpha}", Name = "locationautocomplete")]
mit
[Route("autocomplete"), Route("autocomplete/{keyword:alpha}", HttpGet()]
und es funktioniert perfekt.
Sie angeben müssen Danke !! Ich änderte '[Route (" Autocomplete/{Stichwort: alpha} ", Name =" locationautocomplete ")]' zu '[Route (" Autocomplete "), Route (" Autocomplete/{keyword: alpha} "), HttpGet()] und es funktioniert jetzt perfekt. Das 'HttpGet()' Attribut war der Schlüssel, und die beiden 'Route()' Definitionen zusammen zu verketten, macht es auf die zwei verschiedenen Arten, die ich wollte. –