1

私のルート:

            routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: null,
                constraints: new { id = @"^\d+$" }
            );

            routes.MapHttpRoute(
                name: "ApiControllerActionRoute",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
                );

私の方法:

// GET api/Set/All
        [ActionName("All")]
        public IEnumerable<Set> GetSets()
        {
            var sets = _repository.GetAllSets();
            return sets;
        }

        // GET api/Set/TopLevelSets
        [ActionName("TopLevelSets")]
        public IEnumerable<Set> GetTopLevelSets()
        {
            var sets = _repository.GetTopLevelSets();
            return sets.ToList();
        }

        // GET api/Set/Breadcrumbs/1
        [ActionName("Breadcrumbs")]
        public IEnumerable<Set> GetBreadCrumbs(int id)
        {
            var sets = _repository.GetBreadcrumbs(id);
            return sets.ToList();
        }

        // GET api/Set/5
        public Set GetSet(int id)
        {
            Set set = _repository.GetSet(id);
            if (set == null)
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
            }

            return set;
        }

        // PUT api/Set/5
        public HttpResponseMessage PutSet(Set set)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            _repository.UpdateSet(set);

            return Request.CreateResponse(HttpStatusCode.OK);
        }

        // POST api/Set
        public HttpResponseMessage PostSet(Set set)
        {
            if (ModelState.IsValid)
            {
                _repository.AddSet(set);
                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, set);
                return response;
            }
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }

        // DELETE api/Set/5
        public HttpResponseMessage DeleteSet(int id)
        {         
            _repository.DeleteSet(id);
            return Request.CreateResponse(HttpStatusCode.OK, id);
        }

この時点で、localhost/api/set/1 - getSet メソッドを実行しようとしています。すべてがルートと一致しているように見えますが、何らかの理由で機能していません。私は何が欠けていますか?

4

2 に答える 2

2

デフォルト ルートはデフォルト アクションを設定していないため、「Get」アクションを使用すると、ルーティング エンジンは GetTopLevelSets または GetSet のどちらが必要かを判断できませんでした。デフォルトを追加すると、これが修正されます。

 routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { action = "GetSet" },
                constraints: new { id = @"^\d+$" }
            );

GetSet次を使用して、コントローラーのアクションにデフォルト設定しますapi/set (controller)/1 (id):

于 2013-03-04T04:45:43.790 に答える
1

クエリの API 部分がありませんか? ローカルホスト/ api /set/1

于 2013-03-04T03:39:12.543 に答える