我正在使用一个 Web 服务,它在登录时设置 Thread.CurrentPrincipal 对象,不久之后,当同一 Web 服务的另一个 Web 方法访问 Thread.CurrentPrincipal 时,它的不同/重置
有人可以告诉我这是预期的还是来自同一客户端的不同 webmethod 调用可以访问相同的 Thread.CurrentPrincipal 对象
谢谢
我正在使用一个 Web 服务,它在登录时设置 Thread.CurrentPrincipal 对象,不久之后,当同一 Web 服务的另一个 Web 方法访问 Thread.CurrentPrincipal 时,它的不同/重置
有人可以告诉我这是预期的还是来自同一客户端的不同 webmethod 调用可以访问相同的 Thread.CurrentPrincipal 对象
谢谢
一旦你停止使用一个线程,它就会回到线程池中。
下一次调用将从线程池中获取一个线程,但您无法控制获得哪一个。
您需要在每个请求中发送有关哪个用户正在拨打电话的信息。
这是意料之中的,每个新的 Web 请求实际上都是新线程。每个网络请求都会重置 CurrentThread、CurrentCulture 等内容。
你想要做的是身份验证会话。有许多可能的解决方案。但是要提出一些建议,我必须指定您使用的技术。
例如,ASP.NET ASMX 服务可以使用表单身份验证。他们也知道 ASP.NET 会话。
使用 WCF,您可以启用 ASP.NET 支持,因此您将拥有与 ASP.NET ASMX 服务相同的东西。但您也可以利用Windows Communication Foundation Authentication Service。
无论如何,需要您提供更多信息。
如果您正在为您的网站使用内置的 ASP .NET 身份验证,然后只是从网页调用 Web 服务,您可以在带有装饰的 Web 服务的方法中启用会话变量和用户上下文信息。像这样:
[WebMethod(EnableSession=true)]
public void MyWebMethod()
{
string mySessionVar = HttpContext.Current.Session["sessionVar"].ToString();
IPrincipal currentUser = HttpContext.Current.User;
...
}
如果这不能解决您的问题,请告诉我们您使用 Thread.CurrentPrincipal 对象做什么(您从 Thread.CurrentPrincipal 对象中提取什么)。也许还有另一种解决方案。