簡體   English   中英

如何解決webapi錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM