Intern Day10 - WebAPI一个控制器controller/路由中实现多个HttpGet等方法

问题

当PatientController.cs文件中这么写的时候,会报ambiguous xxx的错误:

    [ApiController]
    [Route("[Controller]")]
    public class PatientController:ControllerBase
    {
        private readonly PatientDbContext _patientDbContext;
        public PatientController(PatientDbContext patientDbContext) 
        {
            _patientDbContext = patientDbContext;
        }

        [HttpGet]
        public List<Patient> list(string keyword, int pageIndex, int pageSize) // 在Patient路由下面
        {
            var skip=pageSize*(pageIndex-1);
            var patient = _patientDbContext.Patients
                .Where(it=>it.Name.Contains(keyword)) 
                .Skip(skip) 
                .Take(pageSize)
                .ToList();
            return patient;
        }
        
        public Patient GetDetail(int id) // 没有特别说明,默认跟随上面,在Patient这个路由下面
        {
            return _patientDbContext.Patients.Find(id);
        } 

        public Patient Add(Patient patient)         // 没有特别说明,默认跟随上面,在Patient这个路由下面
        {
            _patientDbContext.Add(patient); 
            _patientDbContext.SaveChanges(); 
            return patient;
        }
        ……
        ……

原因

在Asp.net WebApi控制器中,在同一个路由下面使用多个Post/Get等( [HttpGet] )请求报错。

因为一个控制器下面只能有一个HttpGet或其他请求,如果想要实现多个请求,我们需要去自定义路由(即标明路由是什么,之后通过每个方法不同的路由去访问请求)。

解决办法

在每个方法上面添加自定义路由,如下面代码所示:

    [ApiController]
    [Route("api/patient")]    // [Route("[Controller]")]  这两个都可以
    public class PatientController:ControllerBase
    {
        private readonly PatientDbContext _patientDbContext;
        public PatientController(PatientDbContext patientDbContext) 
        {
            _patientDbContext = patientDbContext;
        }
        
        [Route("pat0")]
        [HttpGet]
       // [HttpGet("pat0")]   上面这两行和这句话可以互换,都可以用
        public List<Patient> list(string keyword, int pageIndex, int pageSize)
        {
            var skip=pageSize*(pageIndex-1);
            var patient = _patientDbContext.Patients
                .Where(it=>it.Name.Contains(keyword)) 
                .Skip(skip)
                .Take(pageSize) 
                .ToList();
            return patient;
        }
        
        [Route("pat1")]
        [HttpGet]
        public Patient GetDetail(int id) 
        {
            return _patientDbContext.Patients.Find(id);
        } 
    ······
    ······
上一篇:Android 虚拟机访问本地服务器


下一篇:C# httpget