У меня есть работающий модуль Dnn SPA, основанный на Angular 6, который выполняет вызовы к Dnn Service Framework.Все это прекрасно работает для пользователей, принадлежащих к роли администраторов, но когда пользователь входит в систему только с ролями «Все пользователи» или «Зарегистрированные пользователи», мы получаем следующую ошибку в консоли Chrome Dev:
ОШИБКА TypeError:Невозможно прочитать свойство 'длина' неопределенного в http.js: 108 в Array.forEach () в HttpHeaders.lazyInit (http.js: 102) в HttpHeaders.push ../ node_modules/@angular/common/fesm5/http.js.HttpHeaders.init (http.js: 166) в HttpHeaders.push ../ node_modules/@angular/common/fesm5/http.js.HttpHeaders.forEach (http.js: 235) в 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) в tryCatch.js: 17 в subscribeToResult (index.js: 1)
Я подумал, что, возможно, по какой-то причине HTTPHeaders не были добавлены нашимиперехватчик, но глядя на NНа вкладке «Работа», ни один из наших звонков не выполняется.
Попытки решить проблему:
Проверить, запускается ли 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
Я нашел одну запись в журнале, которая была подозрительной, но не смогла связать это с проблемой:
[WARN] DotNetNuke.Entities.Tabs.TabController - неверный tabId -1 портала 0
Изменен уровень доступа для всех контроллеров WebApi
Я изменил все 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
});
}
console.logв getSettings (). подписка никогда не срабатывает!
Любой намек или руководство о том, что еще нужно проверить, было бы замечательно.