Search code examples
c#asp.net-coreasp.net-core-webapirazor-pages

Routing to an ApiController in a razor page app?


I created a ASP.NET Core Razor page app (asp.net version 2.1.1). It works just fine with the normal Pages but I also want an ApiController as in this tutorial: https://learn.microsoft.com/en-us/aspnet/core/tutorials/web-api-vsc?view=aspnetcore-2.1

However, when I create my controller just as in the example above, I get a 404 page whenever I try to reach it.

Is there something I am missing from the startup class?

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddDbContext<DomainDbContext>(opt => opt.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseMvc();
        }

And my apicontroller class:

    [Route("api/[controller]")]
    [ApiController]
    class DomainController : ControllerBase 
    {
        private readonly DomainDbContext _context;

        public DomainController (DomainDbContext context) 
        {
            _context = context;
        }

        [HttpGet]
        public ActionResult<List<Domain>> GetAll()
        {
            return new List<Domain> {new Domain() {Name ="Hello", Tld = ".se", Expiration = DateTime.UtcNow.AddDays(35)}};
        }
}

Everything looks like the guides as far as I can see, but obviously something is not correct since I get 404 for all pages. Even if I create a new method it doesn't really quite work as intended and is unreachable.

The main path I've tried is /api/domain.

Thanks for your help in advance!


Solution

  • You need to have a public controller class.

    So instead of:

    [Route("api/[controller]")]
    [ApiController]
    class DomainController : ControllerBase
    {
        [...]
    } 
    

    You should have this:

    [Route("api/[controller]")]
    [ApiController]
    public class DomainController : ControllerBase // <-- add a public keyword
    {
        [...]
    }