我有一个在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
答案 0 :(得分:2)
只要方法正在执行,会话就应该保持打开状态。即使该方法返回void
,也会回复开始执行该方法的请求。
如果您不需要服务的回复,则可以使用该方法的IsOneWay = true
属性,该属性将告知服务不向客户端发送回复。由于这是一种长时间运行的方法,它不会将数据返回给客户端,因此它使其成为单向方法的良好候选者。在这种情况下,我不确定会话是否会保持打开状态,但这并不重要,因为模拟上下文将作用于服务,并且不依赖于客户端。
在你的方法中,你可以看到这个,因为声明:
WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;
变量identity
的范围限定为Activity
方法。
using (WindowsImpersonationContect ctx = identity.Impersonate())
变量ctx
同样作用于using
方法中的Activity
块。
唯一一次遇到我能想到的问题是服务是否会引发异常并崩溃 - 当然这种方法无法完成。
总而言之,由于模拟是基于服务运行的身份,并且您没有将任何数据返回给客户端,因此会话应该对运行完成的方法或服务的身份都没有影响正在运行。