2015-09-20 85 views
1

我有一個支持MVC一個web表單的項目。我已經創建了一個WEB API 2控制器,該控制器首先使用EF數據庫生成的模型類將SQL錶轉換爲實體模型。當我啓動我的應用程序時,控制器無法按預期工作。我得到以下時,嘗試訪問API:WEB API 2控制器無法訪問資源

HTTP錯誤404.0 - 找不到 您正在尋找已被刪除的資源,有其名稱更改,或者暫時不可用。

我的控制器類如下:

namespace YuClone.Controllers { 
public class VideosController : ApiController 
{ 
    private YuCloneContext db = new YuCloneContext(); 

    // GET: api/Videos 
    public IQueryable<video> Getvideos() 
    { 
     return db.videos; 
    } 

    // GET: api/Videos/5 
    [ResponseType(typeof(video))] 
    public IHttpActionResult Getvideo(long id) 
    { 
     video video = db.videos.Find(id); 
     if (video == null) 
     { 
      return NotFound(); 
     } 

     return Ok(video); 
    } 

    // PUT: api/Videos/5 
    [ResponseType(typeof(void))] 
    public IHttpActionResult Putvideo(long id, video video) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     if (id != video.videoid) 
     { 
      return BadRequest(); 
     } 

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

     try 
     { 
      db.SaveChanges(); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      if (!videoExists(id)) 
      { 
       return NotFound(); 
      } 
      else 
      { 
       throw; 
      } 
     } 

     return StatusCode(HttpStatusCode.NoContent); 
    } 

    // POST: api/Videos 
    [ResponseType(typeof(video))] 
    public IHttpActionResult Postvideo(video video) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     db.videos.Add(video); 
     db.SaveChanges(); 

     return CreatedAtRoute("DefaultApi", new { id = video.videoid }, video); 
    } 

    // DELETE: api/Videos/5 
    [ResponseType(typeof(video))] 
    public IHttpActionResult Deletevideo(long id) 
    { 
     video video = db.videos.Find(id); 
     if (video == null) 
     { 
      return NotFound(); 
     } 

     db.videos.Remove(video); 
     db.SaveChanges(); 

     return Ok(video); 
    } 

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

    private bool videoExists(long id) 
    { 
     return db.videos.Count(e => e.videoid == id) > 0; 
    } 
} } 

可以做些什麼來解決這個問題?


編輯:

這是路線是如何配置在WebApiConfig:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 

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

,其被登記在Application_Start方法中在Global.aspx爲:

RouteConfig.RegisterRoutes(RouteTable.Routes); 

我用來訪問資源的URL是:

http://localhost:5958/api/videos 
+0

你在試圖從哪個網址得到這個信息?你的路由如何設置? – devzero

+0

你能體現路由,也是新的控制器是如何被註冊 – KnightFox

+0

我看到路線註冊,但沒有控制器註冊 – KnightFox

回答

0

您尚未註冊WebAPI路由。

RouteConfig.RegisterRoutes(RouteTable.Routes); 

此代碼只註冊MVC控制器路由。對於Web API,您需要通過調用您提到的類來註冊web API路線 -

var config = GlobalConfiguration.Configuration; 

WebApiConfig.Register(config); //register api routes 
RouteConfig.RegisterRoutes(RouteTable.Routes); 

這應該適合您。

+0

我之後,我仍然有同樣的問題已添加'WebApiConfig.Register(GlobalConfiguration.Configuration);'在Global.aspx中,但我仍然得到像以前一樣的錯誤。 –

1

您需要Global.asax.cs註冊您的WebAPI路線:

GlobalConfiguration.Configure(WebApiConfig.Register); 
+0

感謝您的回答。我將它添加到Global.aspx中,但仍然出現相同的錯誤 –

0

確保您的WebApiConfig.Register後調用RouteConfig.RegisterRoutes。像這樣:

 System.Web.Http.GlobalConfiguration.Configure(WebApiConfig.Register); 
     RouteConfig.RegisterRoutes(RouteTable.Routes);