【问题标题】:ASP.net web servicesASP.net 网络服务
【发布时间】:2009-11-10 11:52:04
【问题描述】:

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

谁能告诉我这是否是预期的,或者来自同一个客户端的不同 webmethod 调用可以访问同一个 Thread.CurrentPrincipal 对象

谢谢

【问题讨论】:

    标签: asp.net web-services multithreading iprincipal


    【解决方案1】:

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

    下一次调用会从线程池中取出一个线程,但你无法控制你得到哪一个。

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

    【讨论】:

    • 感谢您的快速回复,我确实对此有预感,如果不是太多,您可以通过提供/展示示例来提供帮助
    • 或者如果我可以使用 Session 变量
    【解决方案2】:

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

    您正在尝试做的是身份验证会话。有许多可能的解决方案。但要提出建议,我必须说明您使用的技术。

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

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

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

    【讨论】:

    • 我目前正在使用一个 Windows 窗体应用程序,它将使用 Web 服务进行各种操作。根据 Shiraz 评论中的信息,我想我必须实现类似于 API 的所有方法,这些方法将接受每个请求的用户名/密码。或者我很乐意阅读解决方法
    • web 服务 = 这是 ASP.NET ASMX 服务?还是 WCF 服务?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多