我有一个有8种网络方法的网络服务。这些方法是同步调用的,第一个调用对用户进行身份验证,其余方法执行一个工作单元,这些方法一直被调用,直到工作完成。
我需要存储工作状态(例如,接下来要执行的操作,以及当前正在执行的工作。)我目前有一个包含此信息的状态对象。
我的问题是在每个Web服务调用之间保留此对象的最佳方法是什么?请注意,可能有多个用户正在调用此Web服务,每个用户都拥有自己的唯一状态。
以下是我想到的一些场景:
创意#1
将对象存储在会话中。
想法#2 创建一个实例变量,它是userId的HashMap及其各自的数据。类似的东西:
[WebService(Namespace = "http://developer.intuit.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class QBWCService : QBWebConnectorSvc {
// instance variable to hold current session data...
private Dictionary<Guid,Session> Sessions;
public QBWCService () {
Sessions = new Dictionary<Guid,Session>();
}
[WebMethod]
public override string[] authenticate(string strUserName, string strPassword)
{
...
Sessions.Add(UserId, new SessoionObject());
}
[WebMethod]
public override string[] authenticate(Guid UserId)
{
SessionObject o = Sessions[UserId];
}
}
我认为Idea 2将是最干净的“自然方式”,但我不知道实施这种方案的任何含义......你会推荐哪种方式或其他什么?
答案 0 :(得分:1)
你应该看看Windows Workflow Foundation (WF)。您可以设计工作流程,然后插入持久性模型等。
话虽如此 - 你不能使用会话!创建多个Web场/服务器后,它将无法扩展。当然,QBW开发人员API需要扩展并具有容错能力!
有关在ASP.NET中使用它的更多信息是here。
答案 1 :(得分:1)
这可能是你已经做得太大而无法做大型重构的情况之一,但......
与Windows Workflow中的状态工作流完全相同。如果您的计划最终将每个方法公开为自己的封装服务,它将免费为您提供所有状态管理,此外您还可以直观地定义这些服务调用之间的工作流程。
http://msdn.microsoft.com/en-us/magazine/cc163538.aspx
[编辑]:拍摄,绝地击败了我。他说了什么。
答案 2 :(得分:0)
创意2模仿会话状态管理。我没有看到执行您自己的会话声明管理带来的内在好处。
答案 3 :(得分:0)
Idea one的好处是ASP.NET可以为您管理会话。如果您的用户没有完成整个生命周期,那么我可以看到第二个选项成为问题,因为您在哈希表中有引用旧会话的条目。至少如果与#2一起使用,我将在清洁过程中构建,以确保旧会话即将到期。
如果您只需要保留当前的步骤信息,我几乎会投票支持会话,因为没有必要尝试重新发明它。