我使用Angular2与ASP。. NET Core MVC和管理手动URL导航工作得很好,服务器正在用Angular2成功加载我的Home视图。
在用户身份验证中,我将设置一个会话变量,如下所示:
HttpHelper.HttpContext.Session.SetString("isLoggedIn", true.ToString() );
我想要的是,在用户进入应用程序后,如果他想通过手动导航来加载特定的路由,我希望我的服务调用我的ASP控制器来检查用户是否已经通过身份验证,以便我的守卫允许路由。相反,守卫默认设置为false,显然我被重定向到我的登录页面。
这是我的ASP控制器方法,我想调用来更新我的IsLoggedIn值在我的验证。服务:
[HttpGet]
public IActionResult IsConnectedState()
{
if (!String.IsNullOrWhiteSpace(HttpHelper.HttpContext.Session.GetString("isLoggedIn")))
return Ok(true);
else
return Ok(false);
}
以便我的AuthenticationGuard可以调用AuthenticationService来更新管理认证状态的布尔值:
alert(this.authService.isLoggedIn);
if (!this.authService.isLoggedIn) {
this.authService.setupLoggedInState().subscribe(() => { });
}
,用下面的代码更新myauth中的布尔值。服务:
setupLoggedInState() {
alert("Setting Up");
// Setting up the Http call
let lControllerAction: string = "/IsConnectedState";
let lControllerFullURL: string = this.controllerURL + lControllerAction;
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
// Call my ASP Controller IsConnectedState() method
return this.http.get(lControllerFullURL, options)
.map((res: any) => {
// Réponse reçue du WebService
let data = res.json();
alert(data);
if (data == true) {
this.isLoggedIn = true;
}
}
).catch(this.handleError);
}
当我进行身份验证,然后手动导航到一个URL时,我的守卫告诉我布尔值确实被设置为"false",并且当我的服务尝试调用http.get时,我也得到了"Setting"。它似乎在方法的中间有bug,因为我从来没有到达我在ASP控制器中设置的断点。我得到以下错误,我不明白:
"platform-browser.umd.js:937 EXCEPTION: Error: Uncaught (in promise): TypeError: Cannot read property 'toString' of null"
可能是因为我没有在正确的时间调用服务吗?警卫?我的所有其他调用(如身份验证)都使用http。帖子没有任何问题,所以我真的不知道问题是从哪里来的…
在Angular 2 RC5中有一个已知的缺陷,当你执行get
并提供'Content-Type': 'application/json'
标头时,会导致此错误。
对于一个临时的解决方案,在您的请求选项的body
属性中添加一个空字符串:
let options = new RequestOptions({ headers: headers, body: "" });