ASP.NET Core RC1 MVC 6 - 如何从中间件访问 UrlHelper 并创建 Url 到 Action
ASP.NET Core RC1 MVC 6 - How to access UrlHelper From Middleware and create Url to Action
我正在尝试使用中间件重定向 301 遗留 URL。
private static Boolean IsLegacyPathToPost(this HttpContext context)
{
return context.IsLegacyPath() && context.Request.Path.Value.Contains("/archives/");
}
public static void HandleLegacyRoutingMiddleware(this IApplicationBuilder builder)
{
builder.MapWhen(context => context.IsLegacyPathToPost(), RedirectFromPost);
}
private static void RedirectFromPost(IApplicationBuilder builder)
{
builder.Run(async context =>
{
await Task.Run(() =>
{
//urlHelper is instanciated but it's ActionContext is null
IUrlHelper urlHelper = context.RequestServices.GetService(typeof(IUrlHelper)) as IUrlHelper;
IBlogContext blogContext = context.RequestServices.GetService(typeof(IBlogContext)) as IBlogContext;
//Extract key
var sections = context.Request.Path.Value.Split('/').ToList();
var archives = sections.IndexOf("archives");
var postEscapedTitle = sections[archives + 1];
//Query categoryCode from postEscapedTitle
var query = new GetPostsQuery(blogContext).ByEscapedTitle(postEscapedTitle).WithCategory().Build();
var categoryCode = query.Single().Categories.First().Code;
//Redirect
context.Response.Redirect(urlHelper.Action("Index", "Posts", new { postEscapedTitle = postEscapedTitle, categoryCode = categoryCode }), true);
});
});
}
如您所见,我正在使用 MapWhen 方法,这限制了我在 RedirectFromPost 方法中实例化我的 IUrlHelper 实例。
ServiceProvider 给我一个空实例,没有正确使用 IUrlHelper.Action().
所需的 ActionContext
有没有人遇到过类似的挑战并对我有见解?
反射后,由于中间件在MVC之前执行,ActionContext无法创建,因为它根本不存在。
所以正确的方法是,如果您真的想使用 UrlHelper.Action 创建您的 URL,使用遗留的 url 模式创建一个 ActionFilter 或一个专用的 Action。
我正在尝试使用中间件重定向 301 遗留 URL。
private static Boolean IsLegacyPathToPost(this HttpContext context)
{
return context.IsLegacyPath() && context.Request.Path.Value.Contains("/archives/");
}
public static void HandleLegacyRoutingMiddleware(this IApplicationBuilder builder)
{
builder.MapWhen(context => context.IsLegacyPathToPost(), RedirectFromPost);
}
private static void RedirectFromPost(IApplicationBuilder builder)
{
builder.Run(async context =>
{
await Task.Run(() =>
{
//urlHelper is instanciated but it's ActionContext is null
IUrlHelper urlHelper = context.RequestServices.GetService(typeof(IUrlHelper)) as IUrlHelper;
IBlogContext blogContext = context.RequestServices.GetService(typeof(IBlogContext)) as IBlogContext;
//Extract key
var sections = context.Request.Path.Value.Split('/').ToList();
var archives = sections.IndexOf("archives");
var postEscapedTitle = sections[archives + 1];
//Query categoryCode from postEscapedTitle
var query = new GetPostsQuery(blogContext).ByEscapedTitle(postEscapedTitle).WithCategory().Build();
var categoryCode = query.Single().Categories.First().Code;
//Redirect
context.Response.Redirect(urlHelper.Action("Index", "Posts", new { postEscapedTitle = postEscapedTitle, categoryCode = categoryCode }), true);
});
});
}
如您所见,我正在使用 MapWhen 方法,这限制了我在 RedirectFromPost 方法中实例化我的 IUrlHelper 实例。 ServiceProvider 给我一个空实例,没有正确使用 IUrlHelper.Action().
所需的 ActionContext有没有人遇到过类似的挑战并对我有见解?
反射后,由于中间件在MVC之前执行,ActionContext无法创建,因为它根本不存在。
所以正确的方法是,如果您真的想使用 UrlHelper.Action 创建您的 URL,使用遗留的 url 模式创建一个 ActionFilter 或一个专用的 Action。