Home > database >  Not able to route to API in Blazor Server app
Not able to route to API in Blazor Server app

Time:12-23

I’m brand new to Blazor and I’m trying to learn by converting an old website/web API project into a .Net 6 Blazor Server app where I plan to have both the UI and the API in the same application. I created a Controllers folder and added a controller called ApiController. I also set up Entity Framework and created my Entity classes for my SQL database tables. I’ve added the first HTTPGET route and tried hitting it through Postman to see if it will work. However, I keep getting a message that the page can not be found.

I thinking I need to add something to the Program.cs to let it know that I’m wanting to use APIs and Routing but, in my research, I’m not finding what I’m missing or what needs to be added. Most examples want to use a WASM project which probably has the API and Routing information built in.

This is the URL I'm trying to hit.

https://localhost:7168/api/usersadmin/GetAppNames

ApiController.cs

using Microsoft.AspNetCore.Mvc;
using UsersAdmin_AS.Data;

namespace UsersAdmin_AS.Controllers
{
    [Route("api/UsersAdmin/[action]")]
    [ApiController]
    public class ApiController : ControllerBase
    {    
        [HttpGet]
        [Route("GetAppNames")]
        public List<string> GetAppNames()
        {
            //logger.Info("GetAppNames");
            List<string> listAppNames = new List<string>();

            try
            {
                var dataManager = new DataManager();

                listAppNames = dataManager.GetAppNames();
            }
            catch (Exception ex)
            {
                //logger.Error("ERROR: {0} | {1} | {2}", ex.Message, ex.StackTrace, ex.InnerException);
                throw;
            }

            return listAppNames;
        }
}

Program.cs

using UsersAdmin_AS.Data;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseRouting();

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

CodePudding user response:

Replace [Route("api/UsersAdmin/[action]")] with [Route("api/UsersAdmin/[controller]")]

and comment out [Route("GetAppNames")] in your controller.. Your swagger should show GetAppNames endpoint

CodePudding user response:

I found this post and it fixed my issue.

https://stackoverflow.com/questions/70583469/host-web-api-in-blazor-server-application

This is the route I used at the top of the controller.

[Route("api/UsersAdmin/")]

I used this as my specific route.

[HttpGet]
[Route("GetAppNames")]

I added the builder.Services.AddControllers(), commented out the app.MapBlazorHub() and app.MapFallbackToPage("/_Host"). I then added the app.UseEndpoints() function.

Here is my updated Program.cs file.

using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using UsersAdmin_AS.Data;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddControllers();

builder.Services.AddSingleton<WeatherForecastService>();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseRouting();

//app.MapBlazorHub();
//app.MapFallbackToPage("/_Host");

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
    endpoints.MapBlazorHub();
    endpoints.MapRazorPages();
    endpoints.MapFallbackToPage("/_Host");
});


app.Run();
  • Related