【发布时间】: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