DNN 7获取String.Replace调用NavigateUrl时出现空错误 - AdvancedFriendlyUrlProvider

时间:2014-12-15 04:23:46

标签: .net vb.net dotnetnuke dotnetnuke-7

我有一个我在7.3.4平台上开发的自定义模块。我在我的开发安装中使用ModuleSearchBase,其中我重写了GetModifiedSearchDocuments函数以生成模块的搜索文档。

当我在" live"中安装此模块时,会出现问题。 dnn安装。

以下是搜索索引预定事件运行时记录的堆栈跟踪:

DefaultDataProvider:DotNetNuke.Data.SqlDataProvider, DotNetNuke
ExceptionGUID:72337bbc-1a23-4103-bad9-70cbdb0e907d
InnerException:Value cannot be null. Parameter name: oldValue
FileName:
FileLineNumber:0
FileColumnNumber:0
Method:System.String.Replace
StackTrace:
Message:
System.ArgumentNullException: Value cannot be null.
Parameter name: oldValue
   at System.String.Replace(String oldValue, String newValue)
   at DotNetNuke.Entities.Urls.AdvancedFriendlyUrlProvider.GetFriendlyAlias(String path, String& httpAlias, Int32 portalId, FriendlyUrlSettings settings, PortalSettings portalSettings, Boolean& cultureSpecificAlias)
   at DotNetNuke.Entities.Urls.AdvancedFriendlyUrlProvider.FriendlyUrlInternal(TabInfo tab, String path, String pageName, String portalAlias, PortalSettings portalSettings)
   at DotNetNuke.Entities.Urls.AdvancedFriendlyUrlProvider.FriendlyUrl(TabInfo tab, String path, String pageName, PortalSettings portalSettings)
   at DotNetNuke.Services.Url.FriendlyUrl.DNNFriendlyUrlProvider.FriendlyUrl(TabInfo tab, String path, String pageName, PortalSettings settings)
   at DotNetNuke.Common.Globals.NavigateURL(Int32 tabID, Boolean isSuperTab, PortalSettings settings, String controlKey, String language, String pageName, String[] additionalParameters)
   at DotNetNuke.Common.Globals.NavigateURL(Int32 tabID, Boolean isSuperTab, PortalSettings settings, String controlKey, String language, String[] additionalParameters)
   at Krisis.Modules.KrisisStore.Components.FeatureController.GetModifiedSearchDocuments(ModuleInfo moduleInfo, DateTime beginDate)

我尝试了什么:

  1. 对我来说,这看起来我在GetModifiedSearchDocuments中的字符串替换函数中遇到了错误。所以我删除了我正在使用的两个替换功能并重新安装它。这个错误的出现方式完全相同。

  2. 我尝试将一些断点VIA日志记录添加到事件查看器,以查看在抛出此错误之前我的代码将执行多远。这使我能够将错误范围缩小到以下一行:

                    objEventLog.AddLog("BREAK 2", " break 2 " + ModID.ToString, pSettings, -1, DotNetNuke.Services.Log.EventLog.EventLogController.EventLogType.ADMIN_ALERT)
    
                    Dim DetailUrl = NavigateURL(moduleInfo.TabID, pSettings, "Detail", array)
    
                    objEventLog.AddLog("BREAK 3", "DetailUrl = " + DetailUrl, pSettings, -1, DotNetNuke.Services.Log.EventLog.EventLogController.EventLogType.ADMIN_ALERT)
    
  3. 你可以看到"断点"在objEventLog.AddLog函数中。断点2被击中而断点3被击中。代码在NaviagteURL函数上破坏。

    我已经确认tabId值不为null,这是我在模块中的web.api服务中使用的确切代码,它工作正常。此外,此代码在我的本地安装中运行良好。

    我不明白为什么在NaviagteURL值期间抛出oldValue的string.replace null异常。

    问题:

    有人可以帮我弄清楚为什么这个NavigateURL函数会抛出string.replace错误吗?

    提前致谢

    编辑1:

    我找到了相关的This postThis JIRA issue。如果尚未设置主门户别名,则与搜索无关。在这种情况下它已被设置,这个问题似乎已在我之前的版本中修复到我正在运行的那个,所以我不认为这是它。

    编辑2:解决方案

    当我在DNN 7的新搜索功能 GetModifiedSearchDocuments 中创建门户网站设置对象时,它不会自动填充 PortalAlias PrimaryAlias PortalSettings 对象的strong>属性。

    因此,我创建了一个PortalAliasController并手动获取门户网站别名,并将其设置为 PortalSettings 对象。

    感觉就像我正在做一些事情并且创建一个新的PortalSettingsObject(portalID)应该为我执行此任务。我查看了gitHub上的源代码,看起来应该是这样。但就我而言,事实并非如此。

    因此,以下代码是我用来填充完整门户网站设置对象的代码,因此我可以使用 NavigateURL 函数而不会出现错误:

            Public Overrides Function GetModifiedSearchDocuments(moduleInfo As ModuleInfo, beginDate As Date) As IList(Of Entities.SearchDocument)
            Try
    
                Dim SearchDocuments As New List(Of Entities.SearchDocument)
    
                'get list of changed products
                Dim vc As New ViewsController
    
                Dim pList As List(Of vw_ProductList_Short_Active) = vc.GetProduct_Short_Active(moduleInfo.PortalID)
    
                Dim pSettings As New PortalSettings(moduleInfo.PortalID)
    
                ''use portal alias controller to get primary portal alias of current portal
                Dim pac As New PortalAliasController
                Dim pAlias As PortalAliasInfo = TryCast(pac.GetPortalAliasesByPortalId(moduleInfo.PortalID).Where(Function(a) a.IsPrimary).Single, PortalAliasInfo)
                pSettings.PortalAlias = pAlias
                pSettings.PrimaryAlias = pAlias
    
                If pList IsNot Nothing Then
                    ''for each product, create a searchdocument
                    For Each p As vw_ProductList_Short_Active In pList
    
    
                        ''format parapeter array for detail url
                        Dim array() As String = {"mid=" + ModID.ToString, "id=" + p.ProductId.ToString, "item=" + p.Name.Replace(" ", "-")}
    
                        ''format detail url for search item
                        Dim DetailUrl As String = NavigateURL(moduleInfo.TabID, pSettings, "Detail", array)
                        Dim portalAlias As String = pSettings.DefaultPortalAlias
                        DetailUrl = DetailUrl.Replace("///", "//" + portalAlias + "/")
                        ''loop business logic cut out for brevity
                        With SearchDoc
                            .AuthorUserId = p.CreatedByUserId
                            .Body = p.ShortInfo
                            .Description = p.LongInfo
                            .IsActive = True
                            .PortalId = p.PortalId
                            .ModifiedTimeUtc = p.LastUpdatedDate
                            .Title = p.Name + " - " + p.ProductNumber
                            .UniqueKey = Guid.NewGuid().ToString()
                            .Url = DetailUrl
                            .ModuleId = p.ModuleId
                            .ModuleDefId = moduleInfo.ModuleDefID                            
                        End With
    
                        SearchDocuments.Add(SearchDoc)
                    Next
    
                    Return SearchDocuments
    
                Else
                    Return Nothing
                End If
    
            Catch ex As Exception
                LogException(ex)
                Return Nothing
            End Try
    
        End Function
    

1 个答案:

答案 0 :(得分:1)

错误可能来自的DotNetNuke.Entities.Urls.AdvancedFriendlyUrlProvider.GetFriendlyAlias()中唯一的String.Replace是第571行:

friendlyPath = friendlyPath.Replace(Globals.AddHTTP(httpAlias), String.Empty);

httpAlias字符串从外部函数传入:DotNetNuke.Entities.Urls.AdvancedFriendlyUrlProvider.FriendlyUrl()。这应该来自一个返回门户网站别名的核心功能。

使用SettingName =" DefaultPortalAlias&#34>检查PortalSettings表中是否有记录。和正确的价值。还要检查PortalAlias表是否具有门户网站的正确HttpAlias值,每个portalID一条记录是否将IsPrimary标志设置为true。