我有一个在 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"
}
}
我的问题是任务是否仍然完成检索结果并保存它并将状态设置为应有的状态。或者,由于没有公开 session ,模拟将不起作用。还是我错了
问候, 吉里贾·香卡
最佳答案
只要该方法正在执行, session 就应该保持打开状态。即使该方法返回 void
,启动该方法执行的请求也会得到回复。
如果您不需要服务的回复,则可以在方法上使用 IsOneWay = true
属性,这将告诉服务不要向客户端发送回复。由于这是一种长时间运行的方法,不会将数据返回给客户端,因此它非常适合作为单向方法。在这种情况下,我不确定 session 是否保持打开状态,但这并不重要,因为模拟上下文的范围将限定于服务,并且不依赖于客户端。
在您的方法中,由于声明,您可以看到这一点:
WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;
变量identity
的作用域为Activity
方法。
using (WindowsImpersonationContect ctx = identity.Impersonate())
变量 ctx
的作用域同样为 Activity
方法中的 using
block 。
我能想到的唯一一次你会遇到的问题是如果服务抛出异常并崩溃 - 那么该方法当然不会完成。
总而言之,由于模拟是基于服务正在运行的身份,并且您不会向客户端返回任何数据,因此 session 应该对运行完成的方法或服务的身份没有影响正在运行。
关于WCF服务void方法将通过Windows模拟完成操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32122680/