WCF服务void方法将使用Windows Impersonation完成操作

时间:2015-08-20 15:44:45

标签: wcf impersonation

我有一个在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

1 个答案:

答案 0 :(得分:2)

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

如果您不需要服务的回复,则可以使用该方法的IsOneWay = true属性,该属性将告知服务不向客户端发送回复。由于这是一种长时间运行的方法,它不会将数据返回给客户端,因此它使其成为单向方法的良好候选者。在这种情况下,我不确定会话是否会保持打开状态,但这并不重要,因为模拟上下文将作用于服务,并且不依赖于客户端。

在你的方法中,你可以看到这个,因为声明:

WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;

变量identity的范围限定为Activity方法。

using (WindowsImpersonationContect ctx = identity.Impersonate())

变量ctx同样作用于using方法中的Activity块。

唯一一次遇到我能想到的问题是服务是否会引发异常并崩溃 - 当然这种方法无法完成。

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