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
Asp.net web api Kestrel和ASP.NET核心MVC使用自定义基本路径_Asp.net Web Api_Asp.net Core_Asp.net Core Mvc_Kestrel Http Server - Fatal编程技术网

Asp.net web api Kestrel和ASP.NET核心MVC使用自定义基本路径

Asp.net web api Kestrel和ASP.NET核心MVC使用自定义基本路径,asp.net-web-api,asp.net-core,asp.net-core-mvc,kestrel-http-server,Asp.net Web Api,Asp.net Core,Asp.net Core Mvc,Kestrel Http Server,如何在不同的基本路径上装载应用程序 例如,我的控制器的路由是/api/keywords,但在运行web服务器时,我希望basepath是/development,因此我的控制器路由是/development/api/keywords。我宁愿不必修改我的控制器。在旧的Web API版本中,您可以在不同的路径中装载OWIN应用程序,因此我希望执行类似的操作。请看以下内容: public class Program { public static void Main(string[] args)

如何在不同的基本路径上装载应用程序

例如,我的控制器的路由是/api/keywords,但在运行web服务器时,我希望basepath是/development,因此我的控制器路由是/development/api/keywords。我宁愿不必修改我的控制器。在旧的Web API版本中,您可以在不同的路径中装载OWIN应用程序,因此我希望执行类似的操作。

请看以下内容:

public class Program
{
   public static void Main(string[] args)
   {
        var contentRoot = Directory.GetCurrentDirectory();

        var config = new ConfigurationBuilder()
           .SetBasePath(contentRoot)
           .Build();

        var hostBuilder = new WebHostBuilder()

          //Server
           .UseKestrel()

           //Content root - in this example it will be our current directory
           .UseContentRoot(contentRoot)

           //Web root - by the default it's wwwroot but here is the place where you can change it
           .UseWebRoot("wwwroot")

           //Startup
           .UseStartup<Startup>();


        var host = hostBuilder.Build();

        host.Run();
    } 
}
公共类程序
{
公共静态void Main(字符串[]args)
{
var contentRoot=Directory.GetCurrentDirectory();
var config=new ConfigurationBuilder()
.SetBasePath(contentRoot)
.Build();
var hostBuilder=new WebHostBuilder()
//服务器
.UseKestrel()
//contentroot——在本例中,它将是我们当前的目录
.UseContentRoot(contentRoot)
//Web根-默认情况下,它是wwwroot,但这里是您可以更改它的位置
.UseWebRoot(“wwwroot”)
//启动
.UseStartup();
var host=hostBuilder.Build();
host.Run();
} 
}

有两种扩展方法-UseWebRoot()和UseContentRoot()-可用于配置web和内容根。

您可以查看原始的优秀文章

首先创建一个从
iaapplicationmodelconversation
接口继承的类

公共类环境RouteConvention:IAApplicationModelConvention
{
私有只读属性Outemodel\u centralPrefix;
公共环境RouteConvention(IRoutTemplateProvider routeTemplateProvider)
{
_centralPrefix=新属性Outemodel(routeTemplateProvider);
}
公共无效应用(应用程序模型应用程序)
{
foreach(application.Controllers中的var控制器)
{
var matchedSelectors=controller.Selectors.Where(x=>x.AttributeRouteModel!=null).ToList();
if(匹配的选择器.Any())
{
foreach(匹配选择器中的var选择器模型)
{
//这将仅适用于您的API控制器。您可以根据需要进行更改
if(selectorModel.AttributeRootModel.Template.StartsWith(“api”))
{
selectorModel.AttributeRootModel=AttributeRootModel.CombineAttributeOutModel(\u centralPrefix,selectorModel.AttributeRootModel);
}
}
}
}
}
然后创建一个类只是为了更简单和更干净的使用

public静态类mvcoptionsexpressions
{
公共静态void UseEnvironmentPrefix(此MvcOptions选项,iroutTemplateProvider routeAttribute)
{
插入(0,新环境RouteConvention(routeAttribute));
}
}
现在使用它,首先是非常常见的,将您的环境保存在Startup类的属性中

私有IHostingEnvironment\u env;
公共启动(IHostingEnvironment环境)
{
_env=env;
}
然后你需要做的就是调用你的静态扩展类

public void配置服务(IServiceCollection服务)
{
services.AddMvc(选项=>
{
options.UseEnvironmentPrefix(新RouteAttribute(_env.EnvironmentName));
});
}
但是还有最后一件事需要注意。无论您有什么客户端使用您的API,您肯定不想更改您发送的HTTP请求的所有URL。因此,诀窍是创建一个中间件,该中间件将修改您请求的
路径
,以包括您的环境名称。()

公共类环境urlRewritingMiddleware
{
private readonly RequestDelegate\u next;
公共环境UrlRewritingMiddleware(RequestDelegate next)
{
_下一个=下一个;
}
公共异步任务调用(HttpContext上下文,IHostingEnvironment环境)
{
var path=context.Request.path.ToUriComponent();
//同样,这取决于您的需要,是否仅将其激活到API控制器
如果(!path.StartsWith(“/”+env.EnvironmentName)和&path.StartsWith(“/api”))
{
var newPath=context.Request.Path.ToString().Insert(0,“/”+env.EnvironmentName);
context.Request.Path=newPath;
}
wait_next.Invoke(上下文);
}
}
Startup
类中的
ConfigureServices
方法变为

public void配置服务(IServiceCollection服务)
{
app.UseMiddleware();
services.AddMvc(选项=>
{
options.UseEnvironmentPrefix(新RouteAttribute(_env.EnvironmentName));
});
}

唯一的缺点是它不会更改您的URL,因此如果您使用浏览器点击API,您将看不到包含环境的URL。
响应。重定向总是发送GET请求,即使原始请求是帖子。我还没有找到反映URL路径的最终解决方案。

有一个一个名为UsePathBase的方法,可以很容易地实现这一点。

链接已断开。修复了链接。由于链接的repo已存档,这里是新链接。只需使用
app.UsePathBase(new PathString(“/path”)
启动
即可。配置
方法。这是关于文件路径,而不是HTTP请求路径。与OP的问题无关