【问题标题】:webApi controller Routing doesn't workwebApi 控制器路由不起作用
【发布时间】:2016-08-07 17:23:31
【问题描述】:

我有一个带有实体框架的 webApi 项目 我已经使用“带有动作的 webApi2 控制器,使用实体框架”来添加我的一个实体控制器 但是向他们提出请求是行不通的

请求是:

var baseApi = "/api/members/";
    return {
        getAllMembers: getAllMembers
    };
    function getAllMembers() {
        return $http({
            url: baseApi ,
            method: "GET"
        });
    }

webApi 控制器代码为:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;
using sqs;

namespace sqs.Controllers
{
    public class membersController : ApiController
    {
        private sqsEntities db = new sqsEntities();

        // GET: api/members
        public IQueryable<member> Getmembers()
        {
            return db.members;
        }

        // GET: api/members/5
        [ResponseType(typeof(member))]
        public IHttpActionResult Getmember(long id)
        {
            member member = db.members.Find(id);
            if (member == null)
            {
                return NotFound();
            }

            return Ok(member);
        }

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

            if (id != member.AccountNumber)
            {
                return BadRequest();
            }

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

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

            return StatusCode(HttpStatusCode.NoContent);
        }

        // POST: api/members
        [ResponseType(typeof(member))]
        public IHttpActionResult Postmember(member member)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            db.members.Add(member);

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateException)
            {
                if (memberExists(member.AccountNumber))
                {
                    return Conflict();
                }
                else
                {
                    throw;
                }
            }

            return CreatedAtRoute("DefaultApi", new { id = member.AccountNumber }, member);
        }

        // DELETE: api/members/5
        [ResponseType(typeof(member))]
        public IHttpActionResult Deletemember(long id)
        {
            member member = db.members.Find(id);
            if (member == null)
            {
                return NotFound();
            }

            db.members.Remove(member);
            db.SaveChanges();

            return Ok(member);
        }

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

        private bool memberExists(long id)
        {
            return db.members.Count(e => e.AccountNumber == id) > 0;
        }
    }

}

app_start 中的 webApi 配置为:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace sqs
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

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

没有 [RoutePrefix] 和 [Route] 工作,

是否需要任何配置或代码才能使用 web api2?

谢谢!

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-4 asp.net-web-api routing


    【解决方案1】:

    你的Getmember方法参数是id

     public IHttpActionResult Getmember(long id)
            {
                member member = db.members.Find(id);
                if (member == null)
                {
                    return NotFound();
                }
    
                return Ok(member);
            }
    

    但是你的路由配置是name

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

    所以改变你的路线

     routeTemplate: "api/{controller}/{id}",
    

    你也可以在方法之前使用Route属性为每个方法设置一个特定的路由

    [Route("api/getmember/{id}")]
    public IHttpActionResult Getmember(long id)
    

    【讨论】:

    • 感谢您的回答,但我想使用第一个没有任何 id 的方法,意思是:// GET: api/members public IQueryable Getmembers() { return db.members;但是我在配置中将“name”更改为“id”但没有任何改变!
    • 正如我在我的曲中提到的。没有 Route 和 RoutePrefix 有效!我尝试了很多:D
    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2016-12-14
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多