大佬教程收集整理的这篇文章主要介绍了Silverlight 3中WCF服务客户端代理的正常生命周期是什么?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
>我应该为每个异步调用实例化一次服务客户端代理,还是每个Silverlight应用实例一次?
>我应该显式关闭服务客户端代理(就像我在同时调用WCF服务的ASP.NET MVC应用程序中那样)吗?
我发现很多博主和论坛海报相互矛盾.任何人都可以指出任何明确的消息来源或证据来一劳永逸地回答这个问题吗?
现在,如果您正在使用DuplexHttBinding,即,如果您想从服务器调用客户端上的方法,那么您不必为每个请求关闭客户端是很重要的.这只是常识.然而,没有任何文档告诉你,但我发现它绝对是关键的,如果你使用DuplexHttBinding,你应该只有一个客户端实例一次打开.否则,你将遇到各种令人讨厌的超时问题,这些问题真的非常难以排除故障.如果你只有一个连接,你的生活将变得非常容易.
我在自己的代码中强制执行此操作的方法是通过单个静态DataConnectionManager类运行我的所有连接,如果我在关闭第一个连接之前尝试打开第二个连接,则抛出Assert.该课程的一些片段:
private static int clientsOpen; public static int ClientsOpen { get { return clientsOpen; } set { clientsOpen = value; Debug.Assert(clientsOpen <= 1,"Bad things seem to happen when there's more than one open client."); } } public static RoomserviceClient GetRoomserviceClient() { ClientsCreated++; ClientsOpen++; Logger.LogDebugmessage("Clients created: {0}; Clients open: {1}",ClientsCreated,ClientsOpen); return new RoomserviceClient(GetDuplexhttpBinding(),GetDuplexhttpEndpoint()); } public static void TryClientClose(RoomserviceClient client,bool waitForPendingCalls,Action<Exception> callBACk) { if (client != null && client.State != CommunicationState.Closed) { client.CloseCompleted += (sender,E) => { ClientsClosed++; ClientsOpen--; Logger.LogDebugmessage("Clients closed: {0}; Clients open: {1}",ClientsClosed,ClientsOpen); if (e.Error != null) { Logger.LogDebugmessage(e.Error.messagE); client.Abort(); } closingIntentionally = false; if (callBACk != null) { callBACk(e.Error); } }; closingIntentionally = true; if (waitForPendingCalls) { WaitForPendingCalls(() => client.CloseAsync()); } else { client.CloseAsync(); } } else { if (callBACk != null) { callBACk(null); } } }
当然,烦人的部分是,如果你只有一个连接,你需要陷阱,当连接无意中关闭并尝试重新打开它.然后,您需要重新初始化您的不同类注册要处理的所有回调.这并不是那么困难,但要确保它做得对,这很烦人.当然,即使不是不可能,也很难对该部件进行自动化测试. . .
以上是大佬教程为你收集整理的Silverlight 3中WCF服务客户端代理的正常生命周期是什么?全部内容,希望文章能够帮你解决Silverlight 3中WCF服务客户端代理的正常生命周期是什么?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。