I am using a default ReactApp project from visual studio with net5 as framework. This by default comes with a WeatherApiController. Now the problem is, I created a DataContext (DbContext) which I am trying to inject in the ApiController.
[ApiController]
[Route("[controller]")]
public class ActivitiesController : ControllerBase
{
private readonly DataContext _context;
public ActivitiesController(DataContext context)
{
_context = context;
}
/// <summary>
/// Returns an activity by id from the database
/// </summary>
/// <param name="id">Id of activity</param>
/// <returns>Activity</returns>
[HttpGet("{id}")]
public Activity GetActivity(Guid id)
{
return new Activity { Category = "das", City = "city" };
}
[HttpGet]
public IEnumerable<Activity> Get()
{
return _context.Activities.ToArray();
}
}
now when I run this on localhost, everything is working just fine (also the API controller with the DataContext injected), but when I publish it to my domain, any endpoint coming from a controller which has the DataContext injected returns a html file instead of actually working.
public class Startup
{
private readonly IConfiguration _config;
public Startup(IConfiguration config)
{
_config = config;
}
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// In production, the React files will be served from this directory
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/build";
});
services.AddDbContext<DataContext>(options =>
{
options.UseMySql(_config.GetConnectionString("DefaultConnection"), ServerVersion.AutoDetect(_config.GetConnectionString("DefaultConnection")));
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller}/{action=Index}/{id?}");
});
app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseReactDevelopmentServer(npmScript: "start");
}
});
}
}
I added the DataContext as db context in Startup.cs.
Edit: I managed to get an exception by addin a try catch block as following:
public async Task<List<Activity>> Handle(Query request, CancellationToken cancellationToken)
{
try
{
return await _context.Activities.ToListAsync();
}
catch (Exception ex)
{
List<Activity> activities = new List<Activity>();
activities.Add(new Activity { Description = ex.Message });
return activities;
}
}
And this is the message I get:
Error constructing handler for request of type MediatR.IRequestHandler
2[Application.Reactivities.Activities.List+Query,System.Collections.Generic.List
1[Domain.Reactivities.Activity]]. Register your handlers with the container
What could cause the published version only to behave like this and hit this exception when using the DataContext?
Second Edit: I finally managed to log my innerexception and what is going on here is that in production for some reason the database (Google Cloud Sql Database) is timing out on connect.