从异步WCF双工调用更新asp.net页面 – 对象范围 – ASP.NET

我有以下疑问。 我有一个页面“MyPage”,我在页面类中声明了很少的字典对象。

我怀疑是

  1. 如果我将字典声明为私有非静态对象,我无法在该页面类中的函数中使用它(该对象被取消)
  2. 但是,如果我声明字典是静态的,我可以跨越函数跨越对象。 但是,对于现在打开页面的所有用户,该对象是否相同(猜测每个用户将依次拥有该页面的实例具有页面类的实例,并且类的静态变量在所有实例中都是不变的class级)

我的理解是对的吗? 如何声明对象在页面类中的所有函数中可用,并且对于页面的每个实例(用户)都是唯一的。

UPDATE1

好吧,我发现页面类中字典对象的初始化是在不同的线程中完成的(WCF Duplex回调)。 但是在主页面线程中,字典对象仍然保持为null(未初始化)。 有任何想法吗?

UPDATE2

编组 – 任何机会都有用吗?

UPDATE3

回复约翰 –

感谢您的回复。 我现在面临的问题是将数据从客户端的WCF回调类(将在单独的线程中调用)传递到asp.net页面。 那我该怎么做呢? 查看状态可以帮助我跨请求保留数据。 但是当服务器调用回调通知更改时,我应该如何将更改(数据)传递给UI线程(asp.net页面)?

不要做这样的事情。

如果需要在页面之间维护数据,请使用会话状态。 这就是它的用途。 您应该记住,每次请求都会获得页面类的新实例。 不要使用静态来不断更改后续请求的数据。 您可能会遇到多个同时更新数据请求的问题。


你不能用ASP.NET 做这样的事情!

您似乎将此视为桌面程序 – 就好像下次在页面上执行方法时,您的类实例和所有状态仍将存在。 这不是真的 – 当请求完成后,您的页面将被处置。 该页面的任何内容都无效。

特别是,如果在请求结束之前没有发生回调,那么回调方法最好不要引用任何与请求有关的内容,比如页面。 那是因为在请求结束后回调可能会触发! 国家腐败或更糟。

除非您要让页面等待回调,否则最好不要在页面中使用它们。 相反,创建一个单独的Windows服务或其他东西,让它发出请求并等待回调。 然后,该页面可以使用Ajax或其他内容来询问请求是否完整,并在完成后获得响应。


如果你认为你听到我说要回电话给ASP.NET页面,那你就误解了。

创建Windows服务。 您的Windows服务将托管ASP.NET应用程序将与之通信的WCF服务。 WCF服务将跟踪诸如谁加入聊天,谁在打字等事情。

当有趣的事情发生时, 无法通知Web应用程序。 相反,Web应用程序将不得不轮询WCF服务,询问是否发生了任何有趣的事情。 当发生某些事情时,WCF服务会将“某些东西”传递回ASP.NET应用程序(或者可能返回到由AJAX调用的页面)。

我早些时候错过了。 在这种情况下,根本无法使用回调合约。 这并不像网页就像桌面应用程序,每个用户一个,等待通知。 它们更像是一个桌面应用程序,当用户提出请求时,你会在响应到来之前拿走他的PC并给他一个新的,就像它一样。

你是对的第二种情况。 在你的第一种情况下,我猜你的意思是,如果用户点击页面上的多个控件,那么事件处理程序会看到字典为空(而不是来自前一个事件处理程序的结果)。

请记住,页面上的每个请求(甚至来自同一用户)都会创建页面类的新实例。 这意味着每次请求开始时,您的字典都将为空。 变量在后续请求之间保持其值的唯一方法是将其保留在服务器端(例如,在服务器上的用户特定会话信息中),或者将其推送到具有页面内容的客户端,以便它可以是后续请求数据的一部分(因此它在请求之间存储在ViewState或客户端浏览器的其他存储中)。

重读这个问题,有三个独立的状态机,没有一个被耦合在一起 – 因此问题:)

  • “用户状态”的状态 – 这些是字典中的键/值对,它们的生命周期跨越多个页面请求和回调

  • “页面”的状态,需要使用“用户状态”中的数据。 每个页面请求后都会销毁页面。

  • 需要在“用户状态”中填充数据的“服务调用”的状态服务调用通常在每次调用后销毁。

有一些策略可以让您耦合系统:

  • ViewState使得“用户状态”的状态机作为页面状态的一部分向下发送,并在回发时发回。 这可能会限制您执行服务回调的方式

  • 会话使得“用户状态”的状态机存储在服务器端,并且可以通过密钥访问。

  • 用户状态的静态字典,其中外部字典的键将是“用户状态”的标识,其中第一页请求将创建“用户状态”条目,并且您需要管理拆除。 (v.similar类似于会话 – 虽然没有ASP.NET)。

每种解决方案都有很多细微差别 – 我建议轻读:)

你是对的,静态成员对于页面的所有实例都是相同的,因此对所有个人用户都是一样的。 如果要从类中的每个方法访问它,则需要使其成为非静态成员。 您应该查看对象为空的原因。 你在适当的时候正确地实例化它吗?