代码之家  ›  专栏  ›  技术社区  ›  Nabeel

无法命中任何API方法

  •  -2
  • Nabeel  · 技术社区  · 7 年前

    我有这个控制器:

    [Route("api/[controller]")]
    public class UsersController : Controller
    {
        private readonly IDatingRepository _repo;
    
        public UsersController(IDatingRepository repo)
        {
            _repo = repo;
        }
    
        [HttpGet]
        public async Task<IActionResult> GetUsers()
        {
            var users = await _repo.GetAllUsers();
            return Ok(users);
        }
    
        [HttpGet]
        public async Task<IActionResult> GetUser(int id)
        {
            var user = await _repo.GetUser(id);
            if (user != null)
                return Ok(user);
            return NoContent();
        }
    }
    

    我的创业班:

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        public IConfiguration Configuration { get; }
    
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            var key = Encoding.ASCII.GetBytes("super secret key");
            services.AddDbContext<DataContext>(x => x.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
            services.AddTransient<Seed>();
            services.AddCors();
            services.AddMvc();
            services.AddScoped<IAuthRepository, AuthRepository>();
            services.AddScoped<IDatingRepository,DatingRepository>();
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                    .AddJwtBearer(options =>
                    {
                        options.TokenValidationParameters = new TokenValidationParameters
                        {
                            ValidateIssuerSigningKey = true,
                            IssuerSigningKey = new SymmetricSecurityKey(key),
                            ValidateIssuer = false,
                            ValidateAudience = false
                        };
                    });
        }
    
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, Seed seeder)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else{
                app.UseExceptionHandler(builder => {
                    builder.Run(async context => {
                        context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                        var error = context.Features.Get<IExceptionHandlerFeature>();
                        if(error != null)
                        {
                                context.Response.AddApplicationError(error.Error.Message);
                            await context.Response.WriteAsync(error.Error.Message);
                        }
                    });
                });
            }
            //seeder.SeedUser();
            app.UseCors(x => x.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().AllowCredentials());
            app.UseAuthentication();
            app.UseMvc();
        }
    }
    

    我一直想和邮递员打交道:

    localhost.../api/users/getusers
    

    但无法达到任何方法。
    我创建了一个示例控制器,但仍然无法击中该方法。
    当邮递员发送请求时,总是找不到404。我知道这意味着我寻找的资源是不存在的。

    2 回复  |  直到 7 年前
        1
  •  1
  •   George Helyar    7 年前

    尝试 http://localhost:port/api/users

    这个 [HttpGet] 使它使用HTTP GET方法,它不会将操作名添加到路由中,因此路由仍然是控制器的基本路由。使用 [HttpGet("[action]")] 如果你想要的话。

    对于第二个动作,你可能想要 [HttpGet("{id}")] 能够使用 /api/users/123

        2
  •  0
  •   user4851087    7 年前

    我想你可以这样做

    [Route("api/[controller]/[action]")]
    

    然后你只需要像这样调用你的邮递员/api/users/getusers