Webapi скрывает угловые маршруты
Я пытаюсь построить .Объем сердечника 2 веб-API/угловой гибридного приложения. Я следовал учебнику и успешно получил его, обслуживая корень клиентского углового приложения, и маршрутизация внутри клиентского приложения работает. Однако если я попытаюсь перейти непосредственно к маршруту (например, "/register"), используя адресную строку браузера, я получу 404. Похоже, что WebAPI пытается обработать запрос и терпит неудачу, так как контроллеры имеют только маршруты "/api/[controller]/[action]". Я использую маршрутизацию на основе атрибутов. Если это поможет, вот мой файл startup.cs:
using System; using System.Net; using System.Text; using AutoMapper; using FluentValidation.AspNetCore; using Io.BLL.Services.Impl.Auth; using Io.BLL.Services.Interfaces.Auth; using Io.Data; using Io.Data.Entities; using Io.Models.Auth; using Io.Web.Extensions; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Diagnostics; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.IdentityModel.Tokens; namespace Io.Web { public class Startup { public IConfiguration Configuration { get; } private const string SecretKey = "iNivDmHr2E5Q6V3qvnqycprdRj1PVkH"; private readonly SymmetricSecurityKey _signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SecretKey)); public Startup(IConfiguration configuration) { Configuration = configuration; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddDbContext<Context>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly("Io.Web"))); services.AddSingleton<IJwtFactory, JwtFactory>(); // Register the ConfigurationBuilder instance of FacebookAuthSettings services.Configure<FacebookAuthSettings>(Configuration.GetSection(nameof(FacebookAuthSettings))); services.TryAddTransient<IHttpContextAccessor, HttpContextAccessor>(); // jwt wire up // Get options from app settings var jwtAppSettingOptions = Configuration.GetSection(nameof(JwtIssuerOptions)); // Configure JwtIssuerOptions services.Configure<JwtIssuerOptions>(options => { options.Issuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)]; options.Audience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)]; options.SigningCredentials = new SigningCredentials(_signingKey, SecurityAlgorithms.HmacSha256); }); var tokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)], ValidateAudience = true, ValidAudience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)], ValidateIssuerSigningKey = true, IssuerSigningKey = _signingKey, RequireExpirationTime = false, ValidateLifetime = true, ClockSkew = TimeSpan.Zero }; services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(configureOptions => { configureOptions.ClaimsIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)]; configureOptions.TokenValidationParameters = tokenValidationParameters; configureOptions.SaveToken = true; }); // api user claim policy services.AddAuthorization(options => { options.AddPolicy("ApiUser", policy => policy.RequireClaim(JwtFactory.Rol, JwtFactory.ApiAccess)); }); // add identity var builder = services.AddIdentityCore<AppUser>(o => { // configure identity options o.Password.RequireDigit = false; o.Password.RequireLowercase = false; o.Password.RequireUppercase = false; o.Password.RequireNonAlphanumeric = false; o.Password.RequiredLength = 6; }); builder = new IdentityBuilder(builder.UserType, typeof(IdentityRole), builder.Services); builder.AddEntityFrameworkStores<Context>().AddDefaultTokenProviders(); services.AddAutoMapper(); services.AddMvc().AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<Startup>()); services.AddScoped<IAuthService, AuthService>(); services.AddScoped<JwtIssuerOptions>(); } // 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.UseExceptionHandler(builder => { builder.Run( async context => { context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); var error = context.Features.Get<IExceptionHandlerFeature>(); if (error != null) { context.Response.AddApplicationError(error.Error.Message); await context.Response.WriteAsync(error.Error.Message).ConfigureAwait(false); } }); }); app.UseAuthentication(); app.UseDefaultFiles(); app.UseStaticFiles(); app.UseMvc(); } } }
Спасибо за ваше время и вашу помощь!
Что я уже пробовал:
ГРЯЗНОЕ ИСПОЛЬЗОВАНИЕ .Сетчатый сердечник 1.0, угловая скорость V2, веб-API[^]