【问题标题】:Best Practices: Persisting data throughout multiple web method calls最佳实践:在多个 Web 方法调用中持久化数据
【发布时间】:2008-10-22 15:03:30
【问题描述】:

我有一个包含 8 个 Web 方法的 Web 服务。这些方法被同步调用,第一次调用验证用户身份,其余方法执行一个工作单元,这些方法被调用直到工作完成。

我需要存储工作的状态(例如,接下来要执行哪些操作,以及已完成和当前正在执行的工作。)我目前有一个包含此信息的状态对象。

我的问题是在每个 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&gt Sessions; public QBWCService () { Sessions = new Dictionary<Guid,Session&gt(); } [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]; } }

我认为想法 2 将是最干净的“自然方式”,但是我不知道实施这种方案的任何含义......您会推荐哪种方式或其他方式?

【问题讨论】:

    标签: c# .net web-services


    【解决方案1】:

    这可能是您已经无法进行大型重构的情况之一,但是...

    听起来与 Windows 工作流中的状态工作流相同。如果您的计划最终将这些方法中的每一个公开为它们自己的封装服务,那么它将免费为您提供所有状态管理,而且您还可以获得能够直观地定义这些服务调用之间的工作流的额外好处。

    http://msdn.microsoft.com/en-us/magazine/cc163538.aspx

    [编辑]:开枪,绝地打败了我。他说了什么。

    【讨论】:

      【解决方案2】:

      你应该看看Windows Workflow Foundation (WF)。您可以设计您的工作流程,然后插入持久性模型等。

      话虽如此 - 你不能使用会话!一旦您创建了多个网络场/服务器,它就不会扩展。当然,QBW 开发人员 API 需要扩展和容错!

      更多关于在 ASP.NET 中使用它的信息是here

      【讨论】:

      • 我必须保留 Web 服务方案 - 我正在为需要 SOAP 服务的 QuickBooks Web 连接器编写集成块。
      • 您可以保留 Web 服务方案,但使用 WF 来保证其状态和持久性。这里有一些关于在 ASP.NET 中使用 WF 的有趣信息:devx.com/dotnet/Article/29992/1954
      【解决方案3】:

      想法 2 是模仿会话状态管理。我没有看到执行您自己的会话语句管理的内在好处。

      【讨论】:

      • ...当然,除非您需要在会话之间共享数据。但通常避免它,除非你有理由这样做。一个很好的理由。
      【解决方案4】:

      想法之一的好处是 ASP.NET 为您管理会话。如果您的用户没有完成整个生命周期,我可能会看到第二个选项会出现问题,因为您在哈希表中有引用旧会话的条目。如果使用#2,我至少会构建一个清理过程以确保旧会话到期。

      如果您只需要保留当前步骤信息,我几乎会投票给 session,因为尝试重新发明它是没有意义的。

      【讨论】:

      • 有趣的是,在这种情况下,我可以保证我可以管理用户何时注销,或者交易何时完成。
      • 如果您对此有 100% 的把握,那么我认为 #2 没有问题,但我真的很确定您有这个问题……如果客户端在中途断开网络连接怎么办?
      猜你喜欢
      • 1970-01-01
      • 2010-10-19
      • 2018-03-21
      • 2010-10-13
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      相关资源
      最近更新 更多