繁体   English   中英

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

[英]Updating the asp.net page from the asynchronous WCF duplex call - object scope - ASP.NET

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

我的疑问是

  1. 如果我将字典声明为私有的非静态对象,则无法在该页面类中的函数之间使用它(该对象将为空)
  2. 但是,如果我声明字典为静态字典,则可以跨函数访问对象。 但是,该对象在现在已打开页面的所有用户中是否相同(猜测每个用户将拥有该页面的一个实例,而该用户又具有该页面类的一个实例,并且该类的静态变量在所有实例中都是不变的班级的)

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

更新1

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

更新2

编组-有用吗?

更新3

为了回应约翰-

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

您在第二种情况下是正确的。 在第一种情况下,我猜测您的意思是,如果用户单击页面上的多个控件,则事件处理程序将看到字典为空(而不是从先前的事件处理程序获得结果)。

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

重读此问题,有三个独立的状态机,而且没有一个耦合在一起-因此出现了问题:)

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

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

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

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

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

  • 会话,以便将“用户状态”的状态机存储在服务器端,并且可以通过键进行访问。

  • 用户状态的静态字典,其中外部字典的键将是“用户状态”的标识,第一个页面请求将创建“用户状态”条目,并且您需要管理拆卸。 (类似于会话-尽管没有ASP.NET即可使用)。

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

不要做这样的事情。

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


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

您似乎将它当作桌面程序一样对待-好像您的类实例和所有状态在您下次在页面上执行方法时仍然存在。 事实并非如此-请求完成后,您的页面将被处理。 该页面的任何内容均将保持有效。

特别是,如果在请求结束之前没有发生回调,则回调方法最好不要引用与该请求有关的任何内容,例如您的页面。 这是因为在请求结束后可能会触发回调! 状态已恶化或恶化。

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


如果您认为您听到我说过要回ASP.NET页,那么您会误解。

创建一个Windows服务。 您的Windows服务将托管ASP.NET应用程序要与之通信的WCF服务。 WCF服务将跟踪谁加入了聊天,谁在键入等内容。

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

我早点弄错了。 在这种情况下,您根本无法使用回调合同。 并不是说网页就像一个桌面应用程序,每个用户一个,等待通知。 它们更像是一个桌面应用程序,当用户发出请求时,您可以带走他的PC并在响应到来之前给他一个新的PC。

您是对的,静态成员对于页面的所有实例都是相同的,因此对于所有个人用户都是相同的。 如果要从类中的每个方法访问它,则需要使其成为非静态成员。 您应该调查为什么该对象为null。 您是否在适当的时间正确实例化了它?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM