WCF客户端配置:如何检查端点是否在配置文件中,如果不在配置文件中,如何回退到代码中?

WCF客户端配置:如何检查端点是否在配置文件中,如果不在配置文件中,如何回退到代码中?,wcf,wcf-client,wcf-configuration,Wcf,Wcf Client,Wcf Configuration,希望创建一个通过WCF将序列化消息对象发送回服务器的客户端 为了使最终开发人员(不同部门)的工作变得简单,最好是他们不需要知道如何编辑配置文件来设置客户端端点数据 也就是说,端点也没有嵌入/硬编码到客户机中,这将是一件非常棒的事情 在我看来,混合方案是最容易推出的解决方案: 如果(在配置中描述)使用配置文件ELSE,则回退到硬编码端点 我发现: newclient()失败 新客户端(绑定,端点)工作 因此: Client client; try { client = new Client()

希望创建一个通过WCF将序列化消息对象发送回服务器的客户端

为了使最终开发人员(不同部门)的工作变得简单,最好是他们不需要知道如何编辑配置文件来设置客户端端点数据

也就是说,端点也没有嵌入/硬编码到客户机中,这将是一件非常棒的事情

在我看来,混合方案是最容易推出的解决方案:

如果(在配置中描述)使用配置文件ELSE,则回退到硬编码端点

我发现:

  • newclient()失败
  • 新客户端(绑定,端点)工作
  • 因此:

    Client client;
    try {
      client = new Client();
    }catch {
      //Guess not defined in config file...
      //fall back to hard coded solution:
      client(binding, endpoint)
    }
    
    但有没有办法检查(try/catch除外)配置文件是否声明了端点


    如果在配置文件中定义,但未正确配置,上述操作是否也会失败?最好区分这两种情况?

    以下是读取配置文件并将数据加载到易于管理的对象中的方法:

    Configuration c = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    ConfigurationSectionGroup csg = c.GetSectionGroup("system.serviceModel");
    if (csg != null)
    {
        ConfigurationSection css = csg.Sections["client"];
        if (css != null && css is ClientSection)
        {
            ClientSection cs = (ClientSection)csg.Sections["client"];
            //make all your tests about the correcteness of the endpoints here
        }
    }
    
    “cs”对象将公开一个名为“endpoints”的集合,该集合允许您访问在配置文件中找到的所有属性


    请确保您也将“if”的“else”分支视为失败案例(配置无效)。

    我想提出改进版的解决方案,该解决方案只对配置部分使用特殊类型

    Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            ServiceModelSectionGroup serviceModelGroup = ServiceModelSectionGroup.GetSectionGroup(configuration);
            if (serviceModelGroup != null)
            {
                ClientSection clientSection = serviceModelGroup.Client;
                //make all your tests about the correcteness of the endpoints here
    
            }
    

    谢谢Alex想出了一个解决方案。(希望MS能将这些方法添加到框架本身。)Alex方法的问题(对我来说)是Silverlight似乎没有System.Configuration DLL…:(因此,您无法轻松阅读clientconfig。任何人对如何在Silverlight中实现这一点有任何想法,/没有/硬连接到代码中?提前感谢!+1 Nice.LINQified:if(serviceModelGroup!=null&&serviceModelGroup.Client.Endpoints.Cast().any(e=>e.Contract==“Services.IContract”))使用(var contract=new ContractClient()){}否则使用普通