我正在替换使用ASP构建的项目。. NET WebForms和我需要替换。ashx通用处理程序-但我需要保持页面名称,以便有这些uri硬编码的应用程序不需要更新。
我知道如何处理逻辑,那不是问题。问题是这些页面是由我不想更新的应用程序引用的,所以我需要能够使用指向以。ashx结尾的页面的uri。 我已经试过了我能想到的一切。我希望只使用@page指令,如下所示:@page"/mygenerichandler.ashx"
不幸的是,这不起作用。如果是的话,我就万事俱备了。
我看到页面告诉我处理。ashx作为一种参数:
@page"/mygenerichandler/{ashx}";(和它的变体,none work)
这行不通。
我试过用。ashx扩展名命名页面。
我不想更新嵌入了url的应用程序,但它看起来越来越像这是我唯一的选择。
是否有办法在Blazor中接受页面请求,以页面命名为"mygenerichandler.ashx">
我明白了。我正在使用中间件模式,事实证明,这将在管道的早期执行,并允许我检查URL的.ashx扩展名,然后相应地路由。我应该能够从这里返回一个响应——我仍然需要实现那个代码,但它与这个问题没有直接的关系,所以我不会在这里讨论它。
public class HandlerTrapper
{
private readonly RequestDelegate _next;
public string? AccountID { get; set; }
public HandlerTrapper(RequestDelegate next)
{
_next = next;
}
public Task Invoke(HttpContext httpContext) //, [FromQuery(Name = "AccountID")] string accountId
{
string? page = httpContext.Request.Path.Value?.Replace(@"/", "");
Console.WriteLine("Page Name is {0}, AccountID = {1}", page, AccountID);
if(page==null || !page.Contains(".ashx"))
return _next(httpContext);
AccountID = httpContext.Request.Query["AccountID"];
switch (page)
{
case "GetAmzRefreshToken":
break;
}
return _next(httpContext);
}
private
}
// Extension method used to add the middleware to the HTTP request pipeline.
public static class HandlerTrapperExtensions
{
public static IApplicationBuilder UseHandlerTrapper(this IApplicationBuilder builder)
{
return builder.UseMiddleware<HandlerTrapper>();
}
}
在Program.cs中调用:
app.UseHandlerTrapper();
我很确定我可以从这里返回一个响应,在实现基于传入的遗留页面名称的工作代码后,我应该替换我的。ashx通用处理程序。
我在自己的代码中实现了一个更好的解决方案。WebApplication类有一个UrlReWriter方法,当与控制器路由(Controller Routing)结合使用时,它可以很好地解决这个问题。
我将这些行添加到我的Program.cs文件中-我将它们放在UseHttpRedirection和UseRouting调用之前:
RewriteOptions urlOptions = new RewriteOptions().AddRewrite(@"^(.*).ashx$", "api/$1", false);
urlOptions.AddRewrite(@"^(.*).inf$", "api/ComputerInfo", false);
app.UseRewriter(urlOptions);
这解决了我需要处理的两个文件类型模式的问题,如果需要,我可以添加更多。