【问题标题】:WCF service void method Will operation complete with Windows ImpersonationWCF 服务无效方法将使用 Windows 模拟完成操作
【发布时间】:2015-11-14 08:34:36
【问题描述】:

我有一个在 Windows 身份验证上配置的 WCF。这意味着只有经过身份验证的 Windows 用户才能访问。我有一个方法,它不返回任何内容,而是启动一个线程,该线程在被调用的 Windows 用户模拟下执行一些长时间运行的任务。

我的代码如下:

public void SampleTask();
{
    Task.Factory.StartNew(this.Activity);
}

private void Activity()
{
    WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;
    using (WindowsImpersonationContext ctx = identity.Impersonate())
        {
        // Log status in a log database as "In Progress"
            // Do long running task (accessing database as current user)
        // retreive the results and save in a file
        // Update the log database as "Complete"
        }
}

我的问题是检索结果并将其保存并按应有状态放置状态的任务是否仍会完成。或者模拟将不起作用,因为没有开放会话。还是我弄错了

问候, Girija Shankar

【问题讨论】:

  • 只要方法正在运行,会话就应该保持打开状态(假设连接没有断开或出现其他问题)。仅仅因为它返回void 并不意味着它是一个即发即弃类型的操作。也许您将返回void 的操作与标记为IsOneWay=true 的操作混淆了?无论哪种情况,我都希望模拟继续进行,无论它是在方法开始时设置的。
  • @Tim:感谢您的回复。那么在这种情况下,我可以使用 IsOneWay=true 而不是我目前拥有的吗?这适用于 WCF 休息端点吗?我更担心模拟上下文。它会继续还是会抛出错误(我的想法是,由于通道关闭,身份将无效)。另外,当您说连接断开时,您是什么意思?如果客户端应用程序关闭会发生什么。它还能工作并完成吗?
  • 一旦方法被调用,它会一直运行到结束(除非遇到错误),不管客户端发生了什么。一旦建立了模拟上下文,无论客户端是否保持连接,模拟上下文都应该保持有效。 Web 服务(无论是 SOAP 还是 REST)背后的整个理念是客户端和服务不是紧密耦合的,除了服务方法是完全独立的。一旦客户端请求启动该方法,它就不再对发生的事情感兴趣了。
  • 所以在这种情况下,我肯定会推荐使用IsOneWay = true 来防止客户端被捆绑等待响应(即使它是一个无效方法,服务也会发回响应)。简而言之,1) 使用IsOneWay = true 和 2) 模拟上下文是在服务方法的范围内建立和维护的,因此客户端发生的任何事情都应该与服务无关。
  • 如何将 cmets 标记为答案?我没有选择:(

标签: wcf impersonation


【解决方案1】:

只要方法正在执行,会话就应该保持打开状态。即使方法返回void,也会回复开始执行该方法的请求。

如果您不需要服务的回复,您可以在方法上使用IsOneWay = true 属性,这将告诉服务不要向客户端发送回复。由于这是一种不向客户端返回数据的长时间运行的方法,因此它非常适合作为单向方法。在这种情况下,我不确定会话是否会保持打开状态,但这无关紧要,因为模拟上下文将限定在服务范围内,并且不依赖于客户端。

在您的方法中,由于声明,您可以看到这一点:

WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;

变量identity 的作用域是Activity 方法。

using (WindowsImpersonationContect ctx = identity.Impersonate())

变量ctx 的范围同样是Activity 方法中的using 块。

我能想到的唯一一次遇到问题的情况是,如果服务抛出异常并崩溃,那么该方法当然不会完成。

总而言之,由于模拟是基于运行服务的身份,并且您没有向客户端返回任何数据,因此会话应该不会影响运行完成的方法或服务的身份正在运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多