2

VS 2013では、単純なMVC/Web APIアプリケーションを作成しました。これは、写真のモデルがあります。RESTful APIコントローラ/ルートの問題

public class Photo 
{ 
    public int Id{ get; set; } 
    public string Name{ get; set; } 
    public DateTime DateTimeOriginal { get; set; } 
} 

とPhotoController:

Photo[] photos = new Photo[] 
{ 
    new Photo { Id= 1, Name= "Mary B.", DateTimeOriginal = Convert.ToDateTime("May 18, 2015 2:01:22 PM")}, 
    new Photo { Id = 2, Name= "Martin M.", DateTimeOriginal = Convert.ToDateTime("May 18, 2015 2:13:09 PM")}, 
    new Photo { Id = 3, Name= "Sparky", DateTimeOriginal = Convert.ToDateTime("May 18, 2015 2:31:22 PM")} 
}; 


public IEnumerable<Photo> GetAllPhotos() 
{ 
    return photos; 
} 

public IHttpActionResult GetPhoto(int id) 
{ 
    var photo = photos.FirstOrDefault((p) => p.Id == id); 
    if (photo == null) 
    { 
     return NotFound(); 
    } 
    return Ok(photo); 
} 

public IHttpActionResult GetPhoto(string Name) 
{ 
    var photo = photos.FirstOrDefault((p) => p.Name== Name); 
    if (photo == null) 
    { 
     return NotFound(); 
    } 
} 

//I added this to see if this helps with the routing. It didn't 
public IHttpActionResult GetName(string Name) 
{ 
    var photo = photos.FirstOrDefault((p) => p.Name== Name); 
    if (photo == null) 
    { 
     return NotFound(); 
    } 
    return Ok(photo); 

} 

これは、コンパイルし、私はこのようなWebリクエストを発行することができます

http://localhost:59628/api/photos 

をそして、私は配列が返されます写真要素の

私はこのようなWebリクエストを発行することができます

http://localhost:59628/api/photos/2 

を私はID = 2

しかし

http://localhost:59628/api/photos/"Mary B" 

または

Name="Mary B" 
要素が返されます

または

/GET/Name/Mary B 

又は

/api/photos/name/Mary B 

はエラーを返します。

私の最初の質問はなぜですか?写真のサービスに名前で問い合わせるにはどうすればよいですか?

2番目の質問:私は、ルートの設定で情報を参照してくださいが、私はをPhotosControllerにこれを追加した場合でも:

[Route("photos/{photo}/Name")] 
[HttpGet] 
public IHttpActionResult GetName(string Name) 
{ 
    var photo = photos.FirstOrDefault((p) => p.Name== Name); 
    if (photo == null) 
    { 
     return NotFound(); 
    } 
    return Ok(photo); 
} 

私は404 WHYを取り戻しますか?

+0

を更新する必要があります場合はチュートリアル[ASP.NET Web API 2の属性ルーティング](http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 ) – Nkosi

+0

'WebApiConfig.cs'ファイルを見てください。あなたはそのルートについて何を気付いていますか? –

+0

Iはconfig.Routes.MapHttpRoute( 名: "DefaultApi"、 routeTemplate: "APIは、/ {コントローラ}/{ID}"、 デフォルト:新しい{ID = RouteParameter.Optional} )を参照。 – Ron

答えて

1

経路は、APIのリソース要求の処理方法を知るように構成されています。

は、設定に基づいて要求されたリソースをAPIが見つけることができない場合に返されます。

PhotosControllerをルーティング属性について

// Attribute routing. 
config.MapHttpAttributeRoutes(); 

// Convention-based routing. 
config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

ようWebApiConfig.csファイルにそれを設定することを確認し、ルーティング属性を使用することを計画することは、このを見てみましょう

[RoutePrefix("api/photos")] 
public class PhotosController : ApiController { 

    Photo[] photos = new Photo[] 
    { 
     new Photo { Id= 1, Name= "Mary B", DateTimeOriginal = Convert.ToDateTime("May 18, 2015 2:01:22 PM")}, 
     new Photo { Id = 2, Name= "Martin M", DateTimeOriginal = Convert.ToDateTime("May 18, 2015 2:13:09 PM")}, 
     new Photo { Id = 3, Name= "Sparky", DateTimeOriginal = Convert.ToDateTime("May 18, 2015 2:31:22 PM")} 
    }; 

    //GET api/photos 
    [HttpGet] 
    [Route("")] 
    public IEnumerable<Photo> GetAllPhotos() { 
     return photos; 
    } 

    //GET api/photos/5 
    [HttpGet] 
    [Route("{id:int}")] 
    public IHttpActionResult GetPhoto(int id) { 
     var photo = photos.FirstOrDefault((p) => p.Id == id); 
     if (photo == null) { 
      return NotFound(); 
     } 
     return Ok(photo); 
    } 

    //GET api/photos/name/Mary B 
    [HttpGet] 
    [Route("name/{name}")] 
    public IHttpActionResult GetPhotoByName(string name) { 
     var photo = photos.FirstOrDefault((p) => p.Name == name); 
     if (photo == null) { 
      return NotFound(); 
     } 
     return Ok(photo); 
    } 
}