我有一个基于 Angular 6 的 Dnn SPA 模块,它可以调用 Dnn 服务框架。所有这些都适用于属于管理员角色的用户,但是当用户仅使用所有用户或注册用户角色登录时,我们会在 Chrome Dev Console 中收到以下错误:
错误类型错误:无法读取未定义的属性“长度”在 http.js:108 at Array.forEach () at HttpHeaders.lazyInit (http.js:102) at HttpHeaders.push../node_modules/@angular/common/fesm5/ http.js.HttpHeaders.init (http.js:166) at HttpHeaders.push../node_modules/@angular/common/fesm5/http.js.HttpHeaders.forEach (http.js:235) at Observable._subscribe (http .js:1435) 在 Observable.push../node_modules/rxjs/_esm5/internal/Observable.js.Observable._trySubscribe (ReplaySubject.js:83) 在 Observable.push../node_modules/rxjs/_esm5/internal/Observable .js.Observable.subscribe (ReplaySubject.js:69) at tryCatch.js:17 at subscribeToResult (index.js:1)
我认为可能出于某种原因,我们的拦截器没有添加 HTTPHeaders,但是查看 Network 选项卡,我们从未进行过任何调用。
解决问题的尝试:
检查 Angular 是否正在
启动 我的 Angular 应用程序中有一个应用程序初始值设定项,因此我向它添加了一个控制台日志,该日志正在被触发:
export function appInitializer(configurationService: ConfigurationService) {
configurationService.configuration.antiforgeryToken = dnnService.framework.getAntiForgeryValue();
configurationService.apiPath = dnnService.framework.getServiceRoot(dnnService.path);
configurationService.configuration.moduleId = dnnService.moduleId;
configurationService.configuration.tabId = dnnService.tabId;
configurationService.configuration.tabModuleId = dnnService.tabModuleId;
console.log('configuration for app initializer: ', configurationService);
return () => true;
}
检查防伪令牌
应该添加的一个 HTTPHeader 是防伪令牌
dnnService.framework.getAntiForgeryValue()
由于某种原因,该值对于注册用户为空,而对于管理员用户具有适当的值。但是,如果甚至没有拨打电话,那么我不确定这可能是导致问题的原因。
为 WebApi 调用添加了额外的日志记录
我发现了一个可疑的日志条目,但无法将其与问题联系起来:
[警告] DotNetNuke.Entities.Tabs.TabController - 门户 0 的无效 tabId -1
更改了所有 WebApi 控制器的 AccessLevel
我将所有 DnnModuleAuthorisation 更改为以下内容:
[DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.Anonymous)]
我也试过
[DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.View)]
这没有什么区别。
检查对 HTTP WebApi 端点的第一次调用是否正在触发
在 ngDoBootstrap 中,我进行了第一个 HTTP 调用,这是事情停止运行的地方,因此这会让我相信 Angular 中实际上存在问题:
ngDoBootstrap(app) {
console.log('about to get settings');
this.settingsService.getSettings().subscribe((settings: Settings) => {
console.log('fired call to get settings'); //<- Never gets here
});
}
getSettings().subscribe 中的 console.log 永远不会触发!
关于要检查的其他内容的任何提示或指导都会很棒。
原来它是RequestVerificationToken。出于某种原因,Dnn 仅输出管理员的令牌,或者当我已删除的皮肤 (?) 中存在搜索框时。
解决方法是添加搜索并使用样式将其隐藏。例如
<div id="search-top" style="display:none !important">
<dnn:SEARCH ID="dnnSearch2" runat="server" ShowSite="false" ShowWeb="false" EnableTheming="true" Submit="Search" CssClass="SearchButton" />
</div>
我已经用非管理员用户测试过它并且它有效。
有关更多信息,请参阅DnnTracker 上发布的相关Dnn 9 错误:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句