簡體   English   中英

將 DbContext 注入 API 控制器使它們返回 index.html 而不是 .NET5 React webapp 發布版本的實際結果

[英]Injecting DbContext to API controllers makes them return index.html instead of the actual result on published version of NET5 React webapp

我正在使用 visual studio 中的默認 ReactApp 項目,並將 .net5 作為框架。 這默認帶有 WeatherApiController。 現在的問題是,我創建了一個 DataContext (DbContext),我試圖將其注入 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();
    }
}

現在,當我在本地主機上運行它時,一切正常(還有注入了 DataContext 的 API controller),但是當我將它發布到我的域時,任何來自注入了 DataContext 的 controller 的端點都會返回一個 html 文件,而不是實際上工作。

 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");
            }
        });
    }
}

我在 Startup.cs 中添加了 DataContext 作為數據庫上下文。

編輯:我設法通過添加一個 try catch 塊來獲得異常,如下所示:

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;
         }
}

這是我收到的消息:

為 MediatR.IRequestHandler 2[Application.Reactivities.Activities.List+Query,System.Collections.Generic.List 1[Domain.Reactivities.Activity]] 類型的請求構造處理程序時出錯。 向容器注冊您的處理程序

是什么導致發布的版本僅表現得像這樣並在使用 DataContext 時遇到此異常?

第二次編輯:我終於設法記錄了我的 innerexception,這里發生的事情是在生產中由於某種原因數據庫(谷歌雲 Sql 數據庫)連接超時。

我的谷歌雲 SQL 數據庫不接受我的 IP 地址作為有效的 IP 連接,所以我的 DataContext 沒有初始化。

這導致我的處理程序沒有正確初始化,所以一旦我將我的 IP 添加到允許列表,問題就解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM