我有以下路线
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("Hotel", "en/hotels/{*hotelName}",
new { controller = "Hotel", action = "index" });
}
因此以下URL被路由
www.mydomain.com/zh-CN/hotels/my-hotel-name /
www.mydomain.com/zh-CN/hotels/myhotelname /
www.mydomain.com/zh-CN/hotels/my_hotel_name /
在我的控制器中,我有条件检查以查看所传递的URL是否在我的查找表中。例如
public class HotelController : Controller
{
[HttpGet]
[ActionName("Index")]
public ActionResult IndexGet(string hotelFolder)
{
if(CheckIfFolderExists(hotelFolder))
{
return Content("Hotel URL Found");
}
else
{
**//Here, I want to return the actual requested URL as it didn't exist in my lookup table
}
}
}
根据 en / hotels 路径,路由正在工作,如果按如下所示输入了错误的URL,则实际返回的URL会像正常一样返回。
www.mydomain.com/en/attractions/my-attraction-name /
基本上,我想构建一个要路由的URL字典,如果字典中不存在所请求的URL,我想返回所请求的URL,无论是.HTM,.HTML还是.ASP页。
答案 0 :(得分:1)
我不完全理解您的问题,但是如果您要提供除已定义的路由之外的静态html文件,则可以使用 public 或 static 文件夹并允许访问html文件。
您可以通过在此文件夹中创建一个 Web.config 文件并注册处理程序来实现此目的:
<?xml version="1.0"?>
<configuration>
<system.webServer>
<handlers>
<add name="HtmScriptHandler" path="*.htm" verb="GET"
preCondition="integratedMode" type="System.Web.StaticFileHandler" />
<add name="HtmlScriptHandler" path="*.html" verb="GET"
preCondition="integratedMode" type="System.Web.StaticFileHandler" />
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
</configuration>
然后,将在请求时提供任何文件 .htm 或 .html 文件。
答案 1 :(得分:0)
您似乎想在路由表的末尾创建“全部捕获”路由:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("Hotel", "en/hotels/{hotelName}",
new { controller = "Hotel", action = "index" });
// Catch-all Route:
routes.MapRoute("404-PageNotFound", "{*url}",
new { controller = "YourController", action = "PageNotFound" } );
}
查看以下答案:https://stackoverflow.com/a/310636/879352
通过这种方式,您可以构建要路由的URL字典(在全部路由之上),而字典中未捕获的任何内容都将定向到404页。
答案 2 :(得分:0)
似乎最好的处理这些请求的方法是在管道中添加自定义Middleware。
基本上,您的请求会经过多个过滤器(例如静态文件中间件),直到最终到达路由中间件。
这是我知道的在通过路由中间件之后在内部维护有关请求的信息(不使用GET参数)的唯一方法。
示例:
app.Use(async (context, next) =>
{
var path = context.Request.Path;
// Get the name of the hotel
if(CheckIfFolderExists(path.Substring("/en/hotels/".Length))
{
await context.Response.WriteAsync("URL FOUND");
// or write a file to the response
}
else
{
// else let the request through the pipeline
await next.Invoke();
}
});