c# - 如何构建自定义 WebApi 路由,例如“package/{packageName}/{controller}”以路由到单独程序集中的应用程序部件?
问题描述
我们的应用程序在我们称为包的外部程序集中加载控制器。我想创建一个路由,该路由使用诸如package/BillingPackage/Invoice
而不是api/BillingPackage/Invoice
. 这是我所做的:
启动.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseEndpointRouting()
.UseMvc(routes =>
{
routes.MapRoute(
name: "package",
template: "package/{package}/{controller}/{id?}");
routes.MapRoute("api", "api/{controller}/{action=Get}/{id?}");
routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});
app.UseStaticFiles();
}
public IServiceProvider ConfigureServices(IServiceCollection services)
{
var source = new PackageAssemblySource(Configuration);
var packageAssemblies = source.Load();
var builder = new ContainerBuilder();
builder.RegisterModule(new WebApiModule(packageAssemblies));
services
.AddMvc()
.ConfigureApplicationPartManager(manager =>
{
// Add controllers and parts from package assemblies.
foreach (var assembly in packageAssemblies)
{
manager.ApplicationParts.Add(new AssemblyPart(assembly));
}
});
.AddControllersAsServices() // Now that AssemblyParts are loaded.
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);;
builder.Populate(services);
ApplicationContainer = builder.Build();
return new AutofacServiceProvider(ApplicationContainer);
}
然后我定义一个这样的控制器:
[Route("package/BillingPackage/[controller]", Name = "Invoice")]
public class InvoiceController : ControllerBase
{
[HttpGet()]
public ActionResult<Invoice> Get()
{
return new SampleInvoice();
}
}
即使这样,也会package/BillingPackage/Invoice
产生 404 而api/BillingPackage/Invoice
不会。如何让我的 WebApi 服务于端点package
而不是api
?
解决方案
您可能遇到与模板的路由冲突: "package/{package}/{controller}/{id?}"
。
如果在控制器上使用属性路由,则删除该基于约定的路由
要获得所需的行为,您需要包含一个模板参数[Route("package/{package}/[controller]", Name = "Invoice")]
以及一个方法/操作参数public ActionResult<Invoice> Get(string package)
,该参数将从 URL 中的匹配值填充。
例如
[Route("package/{package}/[controller]", Name = "Invoice")]
public class InvoiceController : ControllerBase {
//GET package/BillingPackage/Invoice
[HttpGet()]
public ActionResult<Invoice> Get(string package) {
return new SampleInvoice();
}
}
推荐阅读
- active-directory - 我可以使用脚本将命令从客户端发送到活动目录吗?
- ios - iOS 13 - 如何登录应用内购买沙盒帐户?
- java - 如何检查加盐和散列密码的匹配
- asp.net-core - 你如何在 asp.net 核心中制作一个剃刀视图扩展方法?
- c++ - 'CPythonGraphic::SaveJPEG':无法将参数 2 从 'char *' 转换为 'LPBYTE'
- browser - 没有开发工具的控制台日志记录
- android - 我想用 gridlayoutmanager recyclerview 来做这个
- javascript - 如果找到具有正确属性的 obj,则 Js 返回 true
- php - 如何阅读公用文件夹外的PDF文件?
- elixir - 如何将 Where 子句子查询转换为 Ecto 连接?