3

我正在开发一个使用 CSLA 框架和自定义身份验证的 Winforms 应用程序(即中间层/服务器管理身份验证),并且正在实施会话超时功能。

我遇到的问题是校长的一个奇怪问题。当我在会话超时后登录时,我创建了一个新的 Principal 对象(我自己的自定义 Principal 对象)。这被分配给当前线程,它始终是 UI 线程(我已经检查过并且正在使用 Control.Invoke 来确保登录表单在 UI 线程上运行,并且此表单的点击事件在 UI 线程上运行) .

但是,在此之后,当我单击 UI 中的按钮时,我可以看到委托人已恢复为委托人。

主 UI 线程是否有任何理由或条件能够恢复到以前的 Principal?

在主 UI 线程上的主体周围是否有任何已知的陷阱可以避免?

我已经检查过了,我没有在其他任何地方设置 Thread.CurrentPrincipal。

更新

我通过更改为 aWindows.Forms.Timer来触发我的会话超时解决了这个问题,而不是以前我使用 aSystem.Timers.Timer然后Control.Invoke在需要的地方使用。当我更改此设置时,我在 UI 线程上设置的 Principal 仍然存在,下次在 UI 线程上执行某些操作时。

谁能解释一下?因此,从本质上讲,在 UI 线程上设置 Principal 似乎意味着两种不同的事情......在设置它时是否需要确定某种上下文?

我发现其他几个人似乎有同样的问题......

http://permalink.gmane.org/gmane.comp.windows.devel.dotnet.advanced/14046 https://groups.google.com/forum/#!topic/microsoft.public.dotnet.languages.csharp/_hLhcDB3jHA

4

1 回答 1

1

我相信正在发生的事情是,使用系统计时器,您的代码实际上是在单独的线程上执行的,.net 中的每个线程都可以有自己的主体集(如果您熟悉该属性,它的 ThreadStatic)。但是,Windows 计时器将在您设置主体的 ui 线程中运行您的计时器代码。请注意,当您的计时器代码正在运行时,用户界面没有响应,因为不会发生消息泵送,因此如果您的代码可能需要一段时间,您需要返回系统计时器。

要使新线程看到相同的主体,您应该查看https://msdn.microsoft.com/en-us/library/system.appdomain.setthreadprincipal(v=vs.110).aspx以及 SetPrincipalPolicy 方法应用程序域。

于 2015-01-21T02:00:49.577 回答