2014-09-23 237 views
0

我想不通爲什麼我得到這個錯誤。這是一個新項目,我使用與以前的項目相同的設置。如果有人能指出什麼是不正確的。如何解決webapi錯誤

錯誤消息

$id: "1" 
    Message: "No HTTP resource was found that matches the request URI 'http://localhost:55596 /api/apiClient'." 
    MessageDetail: "No type was found that matches the controller named 'apiClient'." 

的WebAPI配置

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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

app.js

'use strict'; 
var app = angular.module('YoungIntel', [ 
'ngResource', 
'ngRoute', 
'ui.bootstrap' 
]) 
app.factory('Client', function ($resource) { 
return $resource('/api/apiClient/:id', 
    { id: '@id' }, 
    { 'save': { method: 'POST' } }, 
    { 'update': { method: 'PUT' } }, 
    { 'query': { method: 'GET'}}); 
}); 
app.factory('ClientGet', function ($http, $q) { 
    return { 
    query: function() { 
     var deferred = $q.defer(); 
     $http({ method: 'get', url: '/api/apiClient' }) 
       .success(function (data) { 
        deferred.resolve(data); 
       }).error(function (error) { 
        deferred.reject(error); 
       }); 
     return deferred.promise; 
    } 
    } 
}); 

控制器

//GET Clients 
$scope.clientArray = {}; 
ClientGet.query().then(function (data) { $scope.clientArray = data; }, function (reason) { errorMngrSvc.handleError(reason); }); 

apiController

public class apiClientController : ApiController 
    { 
    IClient _adapter; 

    public apiClientController() 
    { 
     _adapter = new ClientDataAdapter(); 
    } 
    public apiClientController(IClient adapter) 
    { 
     _adapter = adapter; 
    } 

    // GET api/<controller> 
    public IHttpActionResult Get() 
    { 
     var model = _adapter.GetClients(); 

     return Ok(model); 
    } 

    // GET api/<controller>/5 
    public IHttpActionResult Get(int id) 
    { 
     Client client = new Client(); 
     client = _adapter.GetClient(id); 
     if (client == null) 
     { 
      return NotFound(); 
     } 
     return Ok(client); 

    } 

    // POST api/<controller> 

    public IHttpActionResult PostnewClient([FromBody]Client newClient) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 
     var client = _adapter.PostNewClient(newClient); 
     return CreatedAtRoute("ClientApi", new { newClient.ClientId }, newClient); 
    } 

    // PUT api/<controller>/5 


    public HttpResponseMessage PutNewClient(int id, Client newClient) 
    { 
     ApplicationDbContext db = new ApplicationDbContext(); 
     if (!ModelState.IsValid) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
     } 

     if (id != newClient.ClientId) 
     { 
      return Request.CreateResponse(HttpStatusCode.BadRequest); 
     } 

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

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

     return Request.CreateResponse(HttpStatusCode.OK); 
    } 

    // DELETE api/<controller>/5 
    public IHttpActionResult DeleteClient(int id) 
    { 

     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 
     return Ok(_adapter.DeleteClient(id)); 
    } 
} 

更新

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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

    } 

仍然得到同樣的錯誤

回答

1

的路線問題的順序。您正在註冊2條相同的路線,因此第一場比賽將執行。 切換到:

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

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

不過,現在你的第一條路線會抓住一切。爲了避免這種情況,您需要將其更改爲與默認路由不同。一種方法是將模板指定爲api/apiClient/{id}

+0

相同的錯誤消息 – texas697 2014-09-23 15:39:32

+0

我懷疑別的事情正在發生。我建議使用[WebApiRouteDebugger](http://blogs.msdn.com/b/webdev/archive/2013/04/04/debugging-asp-net-web-api-with-route-debugger.aspx)弄清楚出了什麼問題。如果仍不能,請在此處發佈調試器輸出的屏幕截圖或結果。 – Mrchief 2014-09-23 15:58:02

0

路線api/apiClient與您的兩條路線相匹配。要解決它只是刪除第二個,你的路線將匹配第一個,並將到達控制器。

+0

不知道我知道你在說哪一個 – texas697 2014-09-23 15:40:51

+0

你應該刪除你最後定義的那個(名字爲'ClientApi') – Kenneth 2014-09-23 16:02:27

+0

沒什麼,我會試着去調試器 – texas697 2014-09-23 16:22:32