[英]How to solve a webapi error
我無法弄清楚為什么會收到此錯誤。 這是一個新項目,我使用的設置與以前的項目相同。 如果有人可以指出什么是不正確的。
錯誤信息
$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 }
);
}
仍然出現相同的錯誤
路線的順序很重要。 您正在注冊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}
。
路線api/apiClient
匹配您的兩條路線。 要解決此問題,只需刪除第二條路線,您的路線將與第一個路線匹配並到達控制器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.