I have added a webapi project to my solution with a controller to do an HttpGet. The Blazor server project can access it fine locally and deployed. I can make a postman call to the service locally, but the deployed version is giving me the Blazor connection failed message from my _Host file. How would I configure webapi access externally without Blazor interfering?
I think it may be a routing issue of some kind that I need to work out. I am using .NET5 and my webapi startup has this:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "myapp.WebApi v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
WebApi Program.cs:
namespace myapp.WebApi
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Blazor Program.cs:
namespace myapp.UI
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
My blazor project Startup:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UsePathBase("/myapp");
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
//TelemetryDebugWriter.IsTracingDisabled = true;
}
else
{
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();
}
// SD2: app.UseSession();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
// SD2: app.UseMvc();
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
// prior fallback setting
// endpoints.MapFallbackToPage("/_Host");
// 1/4/22 https://stackoverflow.com/questions/61268117/how-to-map-fallback-in-asp-net-core-web-api-so-that-blazor-wasm-app-only-interc
endpoints.MapFallbackToPage("{*path:regex(^(?!api).*$)}", "/_Host"); // don't match paths beginning with api
});
}
I am investigating ways to route .../api/... calls to the webapi project and everything else to the blazor project.
In VS, my call that works is https://localhost:44368/api/controller/GetFoos/Year=2020
My deployed call (tried several variations) https://serverName/appName/api/controller/GetFoos/Year=2020
Fails in Blazor. I want Blazor to ignore and have the WebApi handle it.
As of .net 6, you only need to add one line of code to program.cs to enable an API Controller to a Blazor Server App:
builder.Services.AddControllers();
Sample Controller:
[ApiController]
[Route("api")]
public class ApiController : Controller {
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<ApiController> _logger;
public ApiController(ILogger<ApiController> logger) {
_logger = logger;
}
[HttpGet("GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get() {
return Enumerable.Range(1, 5).Select(index => new WeatherForecast {
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
You blazor app will then return a response to an api call of:
http://yourapp/api/getweatherforecast
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With