2012-10-18 70 views
2

过程中改变IP地址和接口想象的情况(这是真实情况):WCF客户端连接

有对笔记本电脑的WCF客户端应用程序。 笔记本电脑通过WiFi连接到互联网。 用户正在连接到WCF服务的笔记本电脑上执行一些操作(请求回复操作)。

然后用户的笔记本电脑处于睡眠状态,用户回家。在家用户唤醒他的笔记本电脑,连接HSPDA/3G调制解调器(不同的接口&IP),并希望继续在客户端应用程序的工作。请注意,应用程序尚未关闭。

用户(客户端应用程序)应该进行身份验证,如果可能的话,应该加密通信。

什么是最佳实践? 为每个操作创建新代理?初始化net.tcp连接和身份验证时,这应该非常慢。

解决方案basicHttp连接(+ HTTPS)与InstanceContextMode.PerCall?请注意,速度和更高的有效载荷是问题。或者最好的解决方案就像“wrapper(Func <>)”,其中包含while循环,直到操作成功完成(失败时,创建新连接并重新调用函数)。

感谢您的建议

回答

0

只要工作单元是必要的,我一直保持连接打开。基本上,只有在应用程序正在执行一些处理时(这些进程需要WCF连接),连接才会打开并可用。保持重新连接的开销可能会更大(并且取决于连接速度可能会增加延迟),但在连接工作时(最不可能发生故障)它也更加安全,我通常将这些资源保存为其他目的。

但是,这一切都取决于应用程序的功能;如果客户端是愚蠢的并且服务正在做所有的工作,那么随着每个功能在服务上执行一个方法,保持连接可能是有意义的。尽管如此,如果连接意外中断,一些失败检查和重新建立。

此外,netTcp将比wsHttp快很多。我个人并没有看到建立netTcp连接的大量延迟(虽然我不知道你正在做什么样的认证(我的一般实现Windows认证))

+0

我通常使用TransportWithMessageCredentials进行身份验证( net.tcp) – Tomino

+0

我知道有一个NET <= 3.5的错误与net.tcp(第一认证/连接真的很慢)的身份验证。我在4.0中面临同样的问题 - 第一次拨打10s,其他电话很快。你不知道这个bug是否在.net 4.5中修复? – Tomino

+0

@Tomino:不知道我是否会把它称为[bug](http://stackoverflow.com/questions/10859832/why-is-the-first-wcf-client-call-slow)。 –