Silverlight 3中WCF服务客户端代理的正常生命周期是什么?

Silverlight 3中WCF服务客户端代理的正常生命周期是什么?,第1张

概述我在网上找到了我的问题的混合答案.详细说明问题: >我应该为每个异步调用实例化一次服务客户端代理,还是每个Silverlight应用实例一次? >我应该显式关闭服务客户端代理(就像我在同时调用WCF服务的ASP.NET MVC应用程序中那样)吗? 我发现很多博主和论坛海报相互矛盾.任何人都可以指出任何明确的消息来源或证据来一劳永逸地回答这个问题吗? 自从V2(现在使用V4)以来,我一直在使用Sil @H_502_2@ 我在网上找到了我的问题的混合答案.详细说明问题:

>我应该为每个异步调用实例化一次服务客户端代理,还是每个Silverlight应用实例一次?
>我应该显式关闭服务客户端代理(就像我在同时调用WCF服务的ASP.NET MVC应用程序中那样)吗?

我发现很多博主和论坛海报相互矛盾.任何人都可以指出任何明确的消息来源或证据来一劳永逸地回答这个问题吗?

解决方法 自从V2(现在使用V4)以来,我一直在使用Silverlight和WCF,这就是我发现的.一般来说,它可以很好地打开一个客户端,只需使用一个客户端进行所有通信.如果您没有使用DuplexHttBinding,它也可以正常工作,每次打开一个新连接,然后在完成后关闭它.而且由于Microsoft在Silverlight中构建WCF客户端的方式,您不会在保持一个客户端始终打开与在每个请求中创建新客户端之间看到很多性能差异. (但是如果你是在为每个请求创建一个新的客户端,那么请确保你也关闭它.)

现在,如果您正在使用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);            }        }    }

当然,烦人的部分是,如果你只有一个连接,你需要陷阱,当连接无意中关闭并尝试重新打开它.然后,您需要重新初始化您的不同类注册要处理的所有回调.这并不是那么困难,但要确保它做得对,这很烦人.当然,即使不是不可能,也很难对该部件进行自动化测试. . .

@H_502_2@ 总结

以上是内存溢出为你收集整理的Silverlight 3中WCF服务客户端代理的正常生命周期是什么?全部内容,希望文章能够帮你解决Silverlight 3中WCF服务客户端代理的正常生命周期是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1001001.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存