12

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.

Antwort

5

Versuchen Sie, eine GET-Anforderung für Such- und AutoVervollständigen-Aktionen auszuführen? Wenn ja, dann müssten Sie mit einem System.Web.Http.HttpGet Attribut dekorieren. Wenn einer Aktion keine Verben wie Get, Put, Post, Delete usw. vorangestellt sind, wird die Web-API standardmäßig als POST angenommen. Ich nehme an, Sie erhalten eine 405 Methode, die nicht erlaubt ist ... richtig?

Die Name-Eigenschaft ist bei der Link nützlich (Url.Link), wo Sie sich einen Namen

+1

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. –