Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不使用所有路线时映射_C#_Asp.net Core_Asp.net Core Middleware - Fatal编程技术网

C# 不使用所有路线时映射

C# 不使用所有路线时映射,c#,asp.net-core,asp.net-core-middleware,C#,Asp.net Core,Asp.net Core Middleware,我需要在一个项目中同时打开网页和API。但是我对路线有困难。我无法使用mapwhen单独设置路由请求。第一条路线;我将所有与语言相关的请求路由到单个控制器。这是我的网页。第二个是默认的api路由 这是我的middlewareExtension public static class WebBuilderMiddlewaresExtension { public static IApplicationBuilder UseWebBuilderMiddlewares(this IApplic

我需要在一个项目中同时打开网页和API。但是我对路线有困难。我无法使用mapwhen单独设置路由请求。第一条路线;我将所有与语言相关的请求路由到单个控制器。这是我的网页。第二个是默认的api路由

这是我的middlewareExtension

public static class WebBuilderMiddlewaresExtension
{
    public static IApplicationBuilder UseWebBuilderMiddlewares(this IApplicationBuilder builder)
    {
        builder.MapWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
        {
            builder.UseRouting();

            builder.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                pattern: "{controller}/{action}/{id?}");

            });
        });
        builder.MapWhen(context => context.Request.RouteValues["culture"] != null || string.IsNullOrEmpty(context.Request.Path), appBuilder =>
        {
            builder.UseRouting();
            builder.UseMiddleware<LanguageMiddleware>();
            builder.UseMiddleware<RouteMiddleware>();
            builder.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "culture-route",
                    pattern: "{culture=tr-TR}/{*default}",
                    defaults: new { culture = "tr-TR", controller = "Home", action = "Index" }
                    );
            });
        });
       

        return builder;
    }
公共静态类WebBuilderMiddlewaresExtension
{
公共静态IApplicationBuilder UseWebbuilderMiddleware(此IApplicationBuilder生成器)
{
appBuilder=>
{
builder.UseRouting();
builder.UseEndpoints(端点=>
{
endpoints.MapControllerRoute(
名称:“默认”,
模式:“{controller}/{action}/{id?}”);
});
});
builder.MapWhen(context=>context.Request.RouteValues[“culture”]!=null | | string.IsNullOrEmpty(context.Request.Path),appBuilder=>
{
builder.UseRouting();
builder.UseMiddleware();
builder.UseMiddleware();
builder.UseEndpoints(端点=>
{
endpoints.MapControllerRoute(
名称:“文化路线”,
模式:“{culture=tr tr}/{*default}”,
默认值:新建{culture=“tr tr”,controller=“Home”,action=“Index”}
);
});
});
返回生成器;
}
这是我的startup.cs

 public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        using (var client = new WebBuilderContext())
        {
            client.Database.EnsureCreated();
        }
    }
    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.AddControllersWithViews()
                .AddRazorRuntimeCompilation(); ;
       
        services.AddLocalization(opts => opts.ResourcesPath = "Resources");
        var supportedCultures = new List<CultureInfo>
        {
        new CultureInfo("tr-TR"),
        new CultureInfo("en-US"),
        };
        // Dil ayarlarını ve varsayılan dil seçimini tanımlıyoruz.
        var localizationOptions = new RequestLocalizationOptions
        {
            SupportedCultures = supportedCultures,
            SupportedUICultures = supportedCultures,
            DefaultRequestCulture = new RequestCulture("tr-TR"),
        };
        var requestProvider = new RouteDataRequestCultureProvider();
        localizationOptions.RequestCultureProviders.Insert(0, requestProvider);
        
        
        
        services.AddScoped<UiDataService>();
        services.AddDbContext<WebBuilderContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DeveloperMsSql")));
        services.AddSession(options => {
            options.Cookie.Name = "Language";
            options.IdleTimeout = TimeSpan.FromMinutes(30); // Zamanı ayarlayabilirsiniz   
        });
    }

    // 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("/Home/Error");
            // 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.UseSession();
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseAuthorization();
        app.UseWebBuilderMiddlewares();
       
公共类启动
{
公共启动(IConfiguration配置)
{
配置=配置;
使用(var client=new WebBuilderContext())
{
client.Database.recreated();
}
}
公共IConfiguration配置{get;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
services.AddControllersWithViews()
.AddRazorRuntimeCompilation();
services.AddLocalization(opts=>opts.ResourcesPath=“Resources”);
var supportedCultures=新列表
{
新文化资讯(“tr”),
新文化信息(“美国”),
};
//阿亚拉尔·瓦萨伊·兰迪尔塞米尼·塔尼姆·约鲁兹(Dil ayarlarınıve varsayılan Dil seçimini tanımlıyoruz)。
var localizationOptions=newrequestlocalizationoptions
{
SupportedCultures=SupportedCultures,
支持的教育=支持的文化,
DefaultRequestCulture=new RequestCulture(“tr”),
};
var requestProvider=new RouteDataRequestCultureProvider();
localizationOptions.RequestCultureProviders.Insert(0,requestProvider);
services.addScope();
services.AddDbContext(options=>options.UseSqlServer(Configuration.GetConnectionString(“developerMSQL”));
services.AddSession(选项=>{
options.Cookie.Name=“语言”;
options.IdleTimeout=TimeSpan.FromMinutes(30);//Zamanıayarlayabilisniz
});
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseExceptionHandler(“/Home/Error”);
//默认的HSTS值为30天。您可能希望在生产场景中更改此值,请参阅https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseSession();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.usewebuildermiddleware();

对于.net core中的api路由,您需要使用路由属性

下面是一个示例(我向.net核心mvc添加了一个api):


此解决方案不适用于我。因为我的网页路由和api路由不同。我的网页路由正在捕获所有请求。我需要将网页和api请求分开。@yiyiyi您需要将此请求转到我的wep页面您是否已将
app.usewebuildermiddleware();
更改为
app.UseEndpoints(endpoints=>{endpoints.mapControllerOute(名称:“default”,模式:{controller=Home}/{action=Index}/{id?}”);}
,这样您就可以使用
api/controllername/xxx
    [ApiController]
    [Route("api/[controller]")]
    public class ApiController : ControllerBase
    {
        [HttpGet]
        [Route("Get")]
        public async Task<IActionResult> Get()
        {
            return Ok();
        }
    }
app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });