Вызовы httpclient на стороне сервера на стороне сервера не доходят до моего класса контроллера веб-API

Я пытаюсь создать многопользовательскую игру с использованием серверного приложения Blazor (RazorComponents) в предварительном просмотре.Net Core 3.0. У меня есть база данных SQL lite и слой доступа к данным в моем проекте сервера для хранения игровой информации. У меня есть класс Controller, также в проекте Server, для возврата объектов из базы данных с использованием уровня доступа к данным. Моя cshtml-страница в проекте приложения выполняет вызов API (используя встроенный HttpClient), пытаясь маршрутизировать мой контроллер, но он не достигает сервера.

Я пробовал разные вызовы клиентов Http, но ни один, кажется, не достигает контроллера. Я чувствую, что упускаю что-то очевидное или неправильно что-то настроил. У меня нет достаточного опыта работы с Razor/MVC, поэтому мне сложно найти и устранить неисправность. Для тестирования я пытаюсь вызвать простой метод, который возвращает строку

В разделе App.Game.cshtml @functions { }:

private async Task SaveGame()
{
    var result = await Client.GetStringAsync("/api/Game/Test");
}

В Server.Controllers.GameController:

public class GameController : Controller
{
    [HttpGet]
    [Route("api/Game/Test")]
    public string Test()
    {
        return "test";
    }
}

Мой файл Server.Startup регистрирует службы MVC и Http следующим образом:

// This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorComponents<App.Startup>();
        services.AddMvc();

        //Code I got from internet to register httpclient service
        if (!services.Any(x => x.ServiceType == typeof(HttpClient)))
        {
            // Setup HttpClient for server side in a client side compatible fashion
            services.AddScoped<HttpClient>(s =>
            {
                // Creating the URI helper needs to wait until the JS Runtime is initialized, so defer it.
                var uriHelper = s.GetRequiredService<IUriHelper>();
                return new HttpClient
                {
                    BaseAddress = new Uri(uriHelper.GetBaseUri())
                };
            });
        }
    }

    // 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();
        }

        app.UseStaticFiles();
        app.UseRazorComponents<App.Startup>();
        app.UseMvc(routes => { routes.MapRoute(name: "default", template: "{controller}/{action}/{id?}"); });
    }

Когда вызывается метод SaveGame() и выполняется клиентский вызов, я вижу это в выводе:

Microsoft.AspNetCore.Hosting.Internal.GenericWebHostService: Информация: запрос на запуск HTTP / 1.1 GET http://localhost:59682/api/Game/Test
Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware: Информация: отправка файла. Путь запроса: '/index.html'. Физический путь: '{путь к моей игре}.Server\wwwroot\index.html'

Таким образом, кажется, что он не получает должным образом маршрутизируется на контроллер. Я гуглил, как другие люди сделали это, и, кажется, я делаю это правильно. Кто-нибудь знает, что мне не хватает?

Я читал следующие уроки: http://learn-blazor.com/architecture/rest-api/ https://medium.freecodecamp.org/how-to-create-an-application-using-blazor-and-entity-framework-core-1c1679d87c7e

1 ответ

Решение

Попробуйте это: положить app.UseMvc(routes => { routes.MapRoute(name: "default", template: "{controller}/{action}/{id?}"); });перед звонком app.UseStaticFiles(); and app.UseRazorComponents<App.Startup>();

Мне кажется, что сервер отправляет index.html вместо этого (StaticFileMiddleware)

На всякий случай, если у кого-то были такие же проблемы, в моем случае это тоже сработало:

app.UseEndpoints(endpoints =>
{
    endpoints.MapDefaultControllerRoute(); // <- this
    endpoints.MapBlazorHub();
    endpoints.MapFallbackToPage("/index_sse");
});
Другие вопросы по тегам