C# System.ServiceModel.Clientbase.Open()做什么?
System.ServiceModel.Clientbase.Open()做什么?我从未使用过它,只是在一些代码中遇到了它。它能抛出异常吗?如果未调用Close(),是否有问题?如果为WCF服务创建代理,则该代理实际上是ClientBase 我的应用程序中的示例:C# System.ServiceModel.Clientbase.Open()做什么?,c#,wcf,C#,Wcf,System.ServiceModel.Clientbase.Open()做什么?我从未使用过它,只是在一些代码中遇到了它。它能抛出异常吗?如果未调用Close(),是否有问题?如果为WCF服务创建代理,则该代理实际上是ClientBase 我的应用程序中的示例: public class DataClient : ClientBase<Classes.IDataService>, Classes.IDataService { public DataClient(string
public class DataClient : ClientBase<Classes.IDataService>, Classes.IDataService
{
public DataClient(string connectToHost)
: base(new NetTcpBinding(SecurityMode.Transport)
{
PortSharingEnabled = true,
Security = new NetTcpSecurity()
{
Transport = new TcpTransportSecurity()
{
ClientCredentialType = TcpClientCredentialType.Windows
}
}
},
new EndpointAddress(string.Format("net.tcp://{0}:5555/MyService",connectToHost)))
{ }
#region IDataService Members
public Classes.Folder GetFolder(string entryID)
{
return Channel.GetFolder(entryID);
}
public Classes.IItem GetItem(string entryID)
{
return Channel.GetItem(entryID);
}
#endregion
}
公共类数据客户端:ClientBase,Classes.IDataService
{
公共数据客户端(字符串连接到主机)
:base(新的nettcppbinding(SecurityMode.Transport)
{
PortSharingEnabled=true,
安全性=新的NetCPSecurity()
{
传输=新的TCPTTransportSecurity()
{
ClientCredentialType=TcpClientCredentialType.Windows
}
}
},
新的端点地址(string.Format(“net.tcp://{0}:5555/MyService”,connectToHost)))
{ }
#区域IDataService成员
public Classes.Folder GetFolder(字符串entryID)
{
返回通道.GetFolder(entryID);
}
public Classes.IItem GetItem(字符串entryID)
{
返回通道.GetItem(entryID);
}
#端区
}
编辑
根据你的要求,我在谷歌上搜索了一下,发现:
实现ICommunicationObject.Open()
这导致:
通信异常
ICommunicationObject无法访问
已打开并已进入故障状态
国家
超时异常
默认打开超时已过
在创建ICommunicationObject之前
能够进入打开状态,并且具有
进入故障状态
此外,根据我的经验和我在网上遇到的“不关闭客户可能会导致各种形式的陌生感,因此通常被认为是这样的”。刚刚发现这篇文章: 最佳实践:共享WCF客户端代理时始终显式打开它 最后指出: 如果不先调用“Open”方法,则在代理上进行第一次调用时,代理将在内部打开。这称为自动打开 为什么??当第一条消息通过自动打开的代理发送时,它将导致代理自动打开。可以使用.NET反射器打开System.ServiceModel.Channels.ServiceChannel.Call方法,请参见以下代码: 当您深入到重新打开的页面时,您将看到它调用CallOnceManager.CallOnce。对于非首次调用,您将点击SyncWait.Wait,它将等待第一个请求完成。此机制用于确保所有请求等待代理打开,并确保正确的执行顺序。因此,所有请求都被序列化为单个执行序列,直到所有请求都从队列中排出。在大多数情况下,这不是理想的行为 为了避免这种“序列化”工件,最佳实践是如上所述显式打开代理。一旦达到这一点,您将能够在多个线程之间共享同一个代理对象
谢谢你,文森特。我想我已经有那么多了。那么System.ServiceModel.Clientbase.Open()做什么呢?它能抛出异常吗?如果不调用Close(),是否有问题?如果以上回答了这些问题,我就不明白了;您介意扩展吗?谢谢,我忽略了它实现了ICommunicationObject,它提供了有关Open()方法的更多信息。它可以抛出CommunicationException和TimeoutException。据我所知,调用Open所做的一切就是设置一个标志并使对象不可配置,因此在正常情况下,我看不出有任何理由在调用web服务的方法之前显式调用Open。
if (!this.explicitlyOpened)
{
this.EnsureDisplayUI();
this.EnsureOpened(rpc.TimeoutHelper.RemainingTime());
}