Url rewriting DNN模块使用的路由被忽略,因为友好URL提供程序截获了请求URL

Url rewriting DNN模块使用的路由被忽略,因为友好URL提供程序截获了请求URL,url-rewriting,routes,dotnetnuke,dnn9,Url Rewriting,Routes,Dotnetnuke,Dnn9,我已经创建了一个自定义DNN模块,它使用路由实现一些功能 我用模式Data/{table}/{action}注册了一条路由。aspx我使用一个类实现DNN的IServiceRouteMapper,它有一个RegisterRoutes方法,称为DNN Startup 该路由已成功注册,并且可以在每个页面请求的RouteTable中看到 但是,每个应该与路由匹配的请求都会导致DNN显示其404错误页面。换句话说,DNN似乎决定请求URL应该与DNN页面匹配,但事实并非如此 如果我将友好URL提供程序

我已经创建了一个自定义DNN模块,它使用路由实现一些功能

我用模式Data/{table}/{action}注册了一条路由。aspx我使用一个类实现DNN的IServiceRouteMapper,它有一个RegisterRoutes方法,称为DNN Startup

该路由已成功注册,并且可以在每个页面请求的RouteTable中看到

但是,每个应该与路由匹配的请求都会导致DNN显示其404错误页面。换句话说,DNN似乎决定请求URL应该与DNN页面匹配,但事实并非如此

如果我将友好URL提供程序配置从urlFormat=advanced更改为urlFormat=searchfriendly,那么路由将成功运行

我的结论是,作为HTTP模块实现的DNN友好URL提供程序首先拦截请求,即在路由匹配开始之前,当处于高级模式时,假定它是页面URL,然后尝试在CMS中查找匹配页面,但失败。但是,在搜索友好模式下,它会让它离开,以便路由匹配可以查看请求

我想让友好的URL提供者保持在高级模式,因为URL更干净。我还想找到一些不涉及的简单解决方案,例如编写自己的友好URL提供程序

在web.config中,URL路由似乎在友好URL提供程序之前就在管道中,因此我不明白为什么会发生上述情况:

编辑:根据请求添加IServiceRouteMapper实现,即注册路由的位置。Navigator.SiteRootFolder是一个返回数据的常量

公共无效注册表RoutesMapRoute mapRouteManager { //DNN在启动时自动调用此方法 RegisterRoutesRouteTable.Routes; } 私有静态void registerOutesRouteCollection路由 { if Global.CanCreateDataContext { Global.MetaModel.RegisterContext 新的EFDataModelProvider=>Global.CreateDataContextGlobal.Context.DataContextAssemblyLocation, 新的ContextConfiguration{ScaffoldAllTables=Global.Context.ScaffoldAllTables}; Global.MetaModel.DynamicDataFolderVirtualPath=string.Format ~/{0}/dynamicDataNavigator.SiteRootFolder; 路线。添加 新的DynamicDataRoutestring.Format{0}/{{table}/{{action}}.aspx,Navigator.SiteRootFolder { 约束=新建RouteValueDictionarynew{action=List | Details | Edit | Insert}, Model=Global.MetaModel }; } }
这实际上是在DNN中创建服务的非标准方式。通常,您会使用一个简单的路由映射器来实现DotNetNuke.Web.Api.IServiceRouteMapper,如下所示:

public class ServiceRouteMapper : IServiceRouteMapper
{   public void RegisterRoutes(IMapRoute mapRouteManager)
    {
        mapRouteManager.MapHttpRoute(
            moduleFolderName: "MyModule",
            routeName: "default", 
            url: "{controller}/{action}",
            namespaces: new[] { "MyCompany.Dnn.MyModule.Controllers" });
    }
}
这将导致以下路线:

/DesktopModules/MyModule/Api/Data/List假设您有一个名为DataController的控制器类和一个名为List的方法

这不会干扰DNN的友好Url提供程序的原因是/DesktopModules是Url提供程序忽略的保留路径

现在,如果您坚持使用完全自定义的路由,您可以向Url提供程序添加路径忽略。为此,如果HostSettings表中存在SettingName=AUM_DoNotRewriteRegEx的记录,则需要添加或更新该记录。下面是一个可以将路径/数据添加到忽略列表的示例脚本

IF NOT EXISTS (SELECT * FROM HostSettings WHERE SettingName = 'AUM_DoNotRewriteRegEx' )
BEGIN
    INSERT INTO HostSettings (SettingName, SettingValue, SettingIsSecure, CreatedByUserId, CreatedOnDate, LastModifiedByUserId, LastModifiedOnDate)
    VALUES('AUM_DoNotRewriteRegEx','/DesktopModules/|/Providers|/LinkClick\.aspx|/Data', 0, -1, GETDATE(), -1, GETDATE())
END
ELSE
BEGIN
    UPDATE HostSettings SET SettingValue = (select SettingValue + '|/Data' from HostSettings where settingname = 'AUM_DoNotRewriteRegEx')
    where SettingName = 'AUM_DoNotRewriteRegEx'
END

你能分享你的IServiceRouteMapper实现的代码吗?我已经添加了它。将路径添加到DoNotRewriteRegEx设置,或将路径更改为DesktopModules下会使路由工作正常。我知道我没有遵循DNN中路由的常规模式,但这是因为路由不适用于API。。。。我正在尝试让ASP.NET动态数据在DNN模块内工作。。。。是的,我知道现在是2019年;