2013-04-17 41 views
0

我試圖使用web api服務更新相冊的值,但是當我使用put請求時,它將獲取到控制器(有時),創建上下文,但是然後沒有找到/運行我有的PUT方法。ASP.NET Web API Put請求無法在控制器中找到方法

我發送類相冊(如下),格式爲JSON到Web API。

public class Album 
{ 
    [ScaffoldColumn(false)] 
    public int Id { get; set; } 

    [Required] 
    public string Title { get; set; } 

    public string Description { get; set; } 

    [Required] 
    public string Artist { get; set; } 

    public string Genre { get; set; } 

    [Required] 
    public int Year { get; set; } 

    [Display(Name="No. Tracks")] 
    public int NumberOfTracks { get; set; } 
} 

這是應該接受這一切

public class AlbumsController : ApiController 
{ 
    private AlbumsContext db = new AlbumsContext(); 

    // GET api/Albums 

    public IQueryable<Album> Get() 
    { 
     return (from a in db.Albums select a); 
    } 

    public IQueryable<Album> Get(int skip, int page) 
    { 
     var ret = (from a in db.Albums select a); 
     ret = ret.OrderBy(a => a.Title); 
     ret = ret.Skip(skip); 
     ret = ret.Take(page); 
     return ret; 
    } 

    // GET api/Albums/5 
    public Album Get(int id) 
    { 
     return db.Albums.FirstOrDefault(a => a.Id == id); 
    } 

    // PUT api/Albums 
    [HttpPut] 
    public HttpResponseMessage Put([FromBody]Album album) 
    { 
     if (!ModelState.IsValid) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
     } 

     db.Entry(album).State = EntityState.Modified; 

     try 
     { 
      db.SaveChanges(); 
     } 
     catch (DbUpdateConcurrencyException ex) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex); 
     } 

     return Request.CreateResponse(HttpStatusCode.OK); 
    } 

    // POST api/Albums 
    public HttpResponseMessage Post(Album album) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Albums.Add(album); 
      db.SaveChanges(); 

      HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, album); 
      response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = album.Id })); 
      return response; 
     } 
     else 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
     } 
    } 

    // DELETE api/Albums/5 
    public HttpResponseMessage Delete(int id) 
    { 
     Album album = db.Albums.Find(id); 
     if (album == null) 
     { 
      return Request.CreateResponse(HttpStatusCode.NotFound); 
     } 

     db.Albums.Remove(album); 

     try 
     { 
      db.SaveChanges(); 
     } 
     catch (DbUpdateConcurrencyException ex) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex); 
     } 

     return Request.CreateResponse(HttpStatusCode.OK, album); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     db.Dispose(); 
     base.Dispose(disposing); 
    } 
} 

中的WebAPI控制器這是服務器控制方法使得PUT請求

[HttpPut] 
public ActionResult Edit(Album album, HttpPostedFileBase Image1, HttpPostedFileBase Image2, HttpPostedFileBase Image3, int AlbumID, int RemoveID = 0) 
{ 
    string AlbumApiUri = "http://localhost:58431/api/Albums"; 

    HttpRequestMessage request = new HttpRequestMessage(); 

    request.RequestUri = new Uri(AlbumApiUri); 

    request.Method = HttpMethod.Put; 

    MediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter(); 

    request.Content = new ObjectContent<Album>(album, jsonFormatter); 

    request.Content.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); 

    album.Id = AlbumID; 

    HttpClient client = new HttpClient(); 

    var response = client.SendAsync(request).Result; 

    if (response.IsSuccessStatusCode) 
    { 
     bool a = true; 
    } 
    else 
    { 
     bool b = true; 
    } 

    return RedirectToAction("Details", new { ID = AlbumID }); 
} 

回答

2

原來我敢很多白癡,這是開始問題的主要原因是我沒有將Album標記爲DataContract幷包含DataMember字段。希望這會教導任何犯同樣錯誤的人!

相關問題