Не удается связаться с контроллером из вида - PullRequest
0 голосов
/ 17 июня 2019

Я использую страницу SPA в качестве просмотра и пытаюсь отправить запрос на мой контроллер.У меня есть 200 код, но нет данных от контроллера.Я предполагаю, что есть некоторые проблемы с маршрутизацией, или я запрашиваю неправильные URL.

Поскольку я думал, что URL похож на

'localhost: 5001 / api / game', 'localhost: 5001 /api / game / get '

должен возвращать значение Json для просмотра, но возвращает страницу индекса spa.

Controller.cs

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace Project.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class GameController : Controller
    {
        [HttpGet("[action]")]
        public async Task<IActionResult> Get()
        {
            return Json(new {test = "123"});
        }
    }
}

Program.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace Project
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
    }
}

Startup.cs

namespace project
{
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        services.AddDbContext<ProjectDbContext>(options => options.UseNpgsql(Configuration.
            GetConnectionString("project_db")));
        services.AddCors();
        services.AddSpaStaticFiles(config => config.RootPath = "Project_front/build");
    }

    // 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();
        }
        else
        {
            // 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.UseStaticFiles();
        app.UseSpaStaticFiles();
        app.UseCors(builder => {
            builder.AllowAnyHeader();
            builder.AllowAnyMethod();
            builder.AllowAnyOrigin();
        });

        app.UseSpa(spa => {
            spa.Options.SourcePath = "project_front";
            if(env.IsDevelopment()){
                spa.UseReactDevelopmentServer(npmScript:"start");
            }
        });

        app.UseHttpsRedirection();
        app.UseMvc();
    }
 }
}

1 Ответ

0 голосов
/ 18 июня 2019

Самая большая проблема - вы используете app.UseMvc(); после вызова UseSpa().

UseSpa() на самом деле является промежуточным ПО, которое описывает dos :

Обрабатывает все запросы с этой точки в цепочке промежуточного программного обеспечения, возвращая страницу по умолчанию для одностраничного приложения (SPA).

Это промежуточное программное обеспечение должно быть размещено в конце цепочки, так что другое промежуточное программное обеспечение для обслуживания статических файлов, действий MVC и т. Д. Имеет приоритет.

Короче говоря, вы никогда не должны включать это промежуточное ПО до UseMvc. Заказ промежуточных программ имеет значение .

Кроме того, при настройке MVC рекомендуется отображать маршруты:

    ...
    app.UseHttpsRedirection();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller}/{action=Index}/{id?}");
    });

    // enable the spa middleware to "catch-all" the requests that are not been processed by previous middlewares
    app.UseSpa(spa => {
        spa.Options.SourcePath = "project_front";
        if(env.IsDevelopment()){
            spa.UseReactDevelopmentServer(npmScript:"start");
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...