12

.NET 4.5 ve Web API 2'nin son sürüm sürümlerini kullanıyorum (Visual Studio 2013'te). this documentation referans olarak kullanıyorum, boşuna. Web API 2 yönlendirme öznitelikleri çalışmıyor

ben gibi olmak URL'leri istiyorum

api/providers 
api/locations 
api/specialties 

gibi birkaç baz yolları Ve İdeal

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

gibi her bazı yöntemleri var

  • /api/locations/12345 (konum 12345)
  • /API/yerleri/klinik (adında "klinik" ile konumlarını olsun)
  • /API/yerleri/otomatik tamamlama? Keyword = klinik ("klinik alan yerler için bir özet kimliği + Adı nesneyi almak ") adında
  • /aPI/yerleri/search? zipcode = 12345 & yarıçap = 20 & name = klinik (get ile zip 12345 20 mil çevresindeki konumlar ") adına" klinik

Aşağıdaki kod yığınında, Get yöntemleri ve Search istendiği gibi çalışır, ancak Autocomplete bunu yapmaz. Birden fazla kontrolörde benzer şekilde adlandırılmış yöntemlere sahip olduğum belirtilmelidir. Neyi yanlış yapıyorum? (Ayrıca, tam için Name = mülkiyet nedir?)

/// <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); 
    } 

henüz bu şeyler son sürümleri etrafında toplum çok destek olmaya görünmüyor. (Cevap)

DÜZENLEME

Basitçe

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

ile

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

yerini ve mükemmel çalışıyor.

cevap

5

Arama ve Otomatik Tamamlama eylemlerinde GET isteği yapmaya çalışıyor musunuz? Eğer evet ise, o zaman bir System.Web.Http.HttpGet özniteliği ile dekore etmeniz gerekecektir. Bir eylem Get, Put, Post, Delete vb. Gibi fiiller tarafından öntanımlı değilse, varsayılan olarak Web API'sı POST olarak kabul edilir. 405 Yönteme İzin Verilmediğini tahmin ediyorum.

Adı mülkü bağlantı nesil durumunda (Url.Link) yararlıdır Eğer

+1

teşekkür ederiz bir ad belirtin gerekir nerede !! '[Rota (" autocomplete/{keyword: alpha} ", Name =" locationautocomplete ")]' '' '' '' (Route ("otomatik tamamlama"), Route ("autocomplete/{keyword: alpha}"), HttpGet’i değiştirdim()] ve şimdi mükemmel çalışıyor. 'HttpGet()' özniteliği önemliydi ve iki 'Rota() 'tanımlarının zincirlenmesi, onu istediğim iki farklı şekilde çalıştırıyor. –

İlgili konular