1

我正在使用一个 Web 服务,它在登录时设置 Thread.CurrentPrincipal 对象,不久之后,当同一 Web 服务的另一个 Web 方法访问 Thread.CurrentPrincipal 时,它的不同/重置

有人可以告诉我这是预期的还是来自同一客户端的不同 webmethod 调用可以访问相同的 Thread.CurrentPrincipal 对象

谢谢

4

3 回答 3

1

一旦你停止使用一个线程,它就会回到线程池中。

下一次调用将从线程池中获取一个线程,但您无法控制获得哪一个。

您需要在每个请求中发送有关哪个用户正在拨打电话的信息。

于 2009-11-10T11:55:38.530 回答
0

这是意料之中的,每个新的 Web 请求实际上都是新线程。每个网络请求都会重置 CurrentThread、CurrentCulture 等内容。

你想要做的是身份验证会话。有许多可能的解决方案。但是要提出一些建议,我必须指定您使用的技术。

例如,ASP.NET ASMX 服务可以使用表单身份验证。他们也知道 ASP.NET 会话。

使用 WCF,您可以启用 ASP.NET 支持,因此您将拥有与 ASP.NET ASMX 服务相同的东西。但您也可以利用Windows Communication Foundation Authentication Service

无论如何,需要您提供更多信息。

于 2009-11-10T12:24:11.337 回答
0

如果您正在为您的网站使用内置的 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 对象中提取什么)。也许还有另一种解决方案。

于 2009-11-11T23:37:17.787 回答