Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.ServiceModel.Clientbase.Open()做什么?_C#_Wcf - Fatal编程技术网

C# System.ServiceModel.Clientbase.Open()做什么?

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

System.ServiceModel.Clientbase.Open()做什么?我从未使用过它,只是在一些代码中遇到了它。它能抛出异常吗?如果未调用Close(),是否有问题?

如果为WCF服务创建代理,则该代理实际上是ClientBase

我的应用程序中的示例:

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());
}