最佳实践:在多个Web方法调用中保留数据

时间:2008-10-22 15:03:31

标签: c# .net web-services

我有一个有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将是最干净的“自然方式”,但我不知道实施这种方案的任何含义......你会推荐哪种方式或其他什么?

4 个答案:

答案 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一起使用,我将在清洁过程中构建,以确保旧会话即将到期。

如果您只需要保留当前的步骤信息,我几乎会投票支持会话,因为没有必要尝试重新发明它。