【问题标题】:Converting programmatic configuration of WCF service to config file将 WCF 服务的编程配置转换为配置文件
【发布时间】:2010-11-19 16:25:01
【问题描述】:

我编写了一个以编程方式配置的简单 WCF Web 服务。它公开了三个端点,它们将不同的绑定绑定到同一个合约:

  • WebHttpBinding
  • WebHttpRelayBinding(通过 Microsoft azure)
  • myBinding(在附加 DLL 中自制绑定)

目前配置代码非常简单:

WebServiceHost host = new WebServiceHost(
    typeof(MyService), new Uri("http://localhost:80/"));

host.AddServiceEndpoint(typeof(MyService), new WebHttpBinding(), "");

ServiceEndpoint sbEndpoint = host.AddServiceEndpoint(
    typeof(MyService), new WebHttpRelayBinding(), "http://azureURL");
TransportClientEndpointBehavior sbBehavior =
    new TransportClientEndpointBehavior();
sbBehavior.CredentialType = TransportClientCredentialType.UserNamePassword;
sbBehavior.Credentials.UserName.UserName = "azureUserName";
sbBehavior.Credentials.UserName.Password = "azurePassword";
sbEndpoint.Behaviors.Add(sbBehavior);

host.AddServiceEndpoint(typeof(MyService), new MyBinding(), "http://someURL");

host.Open();

现在我想将此配置导出到配置文件中,因为我希望能够更改它而无需重新编译。

此时我的问题是:

  • 在哪里可以找到有价值的信息来实现我的目标?大多数网站只谈论 SOAP 绑定 - 没有提及如何包含非标准绑定。
  • 我是否必须更改 MyBinding 才能通过 app.config 接受配置,或者 ServiceModel 在配置正常时是否像我的编程方法一样调用它?

【问题讨论】:

    标签: wcf web-services configuration app-config


    【解决方案1】:

    可以解决配置文件无法正确识别的问题。

    只需要添加

    ServiceHost h = new ServiceHost(typeof(MyService));
    h.Open();
    

    对于我的代码,我认为 ServiceModel 会自动启动服务,因为它知道所有信息。 在配置文件中添加有关“MyService”的信息,然后还必须在代码中指定它,这有点奇怪。

    然而,我的问题的真正答案是由 marc_s 给出的,他很好地描述了从编程方法到配置文件的整个转换过程。

    【讨论】:

      【解决方案2】:

      好的,所以最重要的是:

      • 地址
      • 绑定
      • 合同

      然后加入一些额外的东西。

      1) 地址:

      从这里获取:

      WebServiceHost host = new WebServiceHost(
          typeof(MyService), new Uri("http://localhost:80/"));
      host.AddServiceEndpoint(typeof(MyService), new WebHttpBinding(), "");
      

      这里:

      ServiceEndpoint sbEndpoint = host.AddServiceEndpoint(
          typeof(MyService), new WebHttpRelayBinding(), "http://azureURL");
      

      所以你需要这样的东西:

      <endpoint address=""
      <endpoint address="http://azureURL"
      <endpoint address=""http://someURL"
      

      为您服务。

      2) 绑定:

      第一个端点是 webHttpBinding,第二个端点使用自定义绑定(“MyBinding”) - 所以你有:

      <endpoint address="" 
                binding="webHttpBinding"
      <endpoint address="http://azureURL"
                binding="webRelayHttpBinding"
      <endpoint address=""http://someURL"
                binding="myBinding"
      

      你需要定义你的自定义绑定:

      <bindings>
        <customBinding>
          <binding name="MyBinding">
            .. define the parameters of your binding here
          </binding>
        </customBinding>
      </bindings>
      

      或为存储在单独程序集中的代码中的绑定创建一个&lt;extensions&gt; 部分。

      3) 合同

      我在任何地方都没有清楚地看到合同 - 你只使用过 typeof(MyService),但通常,这是具体的服务 instance,而不是服务 contract 这应该是一个接口(类似于IMyService)。为什么没有明确的服务合同?

      无论如何,如果您的服务实现同时也是合同(不是最佳实践!但可能),那么您的两个端点是这样的:

      <endpoint address="" 
                binding="webHttpBinding"
                contract="MyService" />
      <endpoint address="http://azureURL"
                binding="webHttpRelayBinding"
                contract="MyService" />
      <endpoint address="http://someURL"
                binding="myBinding"
                contract="MyService" />
      

      然后你需要在这里和那里添加一些点缀(定义服务的“基地址”,给服务命名等等),最终应该是这样的:

      <system.serviceModel>
          <bindings>
            <customBinding>
              <binding name="MyBinding">
                .. define the parameters of your binding here
              </binding>
            </customBinding>
          </bindings>
          <services>
            <service name="YourNameSpace.MyService">
              <host>
                <baseAddresses>
                   <add baseAddress="http://localhost:80/" />
                </baseAddresses>
               </host>
               <endpoint address="" 
                         binding="webHttpBinding"
                         contract="MyService" />
               <endpoint address="http://azureURL"
                         binding="webHttpRelayBinding"
                         contract="MyService" />
               <endpoint address="http://someURL"
                         binding="myBinding"
                         contract="MyService" />
            </service>
          </services>
      </system.serviceModel>
      

      现在您所缺少的只是定义的行为 - 我将把它作为海报的练习 :-)

      这有什么帮助吗?

      至于参考 - 嗯.....很难说....我猜是通常的书籍(MLBustamante 的“Learning WCF”适合初学者/中级,Juval Lowy 的“Programming WCF”适合中级/高级)是我最好的选择,而且经验丰富,真的。我不知道有任何来源明确显示并教授如何在代码和配置中的设置之间进行转换 - 提到的两本书通常显示两种方式,从这里你可以自己弄清楚。

      马克

      【讨论】:

      • 感谢您解释构建配置文件的过程。正如您所料,服务实现也是契约。我选择了这个,因为合约只包含两个非常通用的功能并且不可重用。我首先尝试使用 webHttpBinding 并注释掉现有的编程设置。但是,它不起作用。当我在 Web 浏览器中打开 localhost 时,无法访问该服务。我是否必须在 VS 中为应用程序进行一些其他设置? (目前它是一个标准的“控制台应用程序”。)
      • 嗯,您遇到的一个问题是:对于 webHttp 绑定,您需要 WebServiceHost - 对于其他绑定,您需要直接的 ServiceHost - 所以您可能无法在其中托管所有端点单个 (Web)ServiceHost
      猜你喜欢
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2012-02-07
      • 2021-12-19
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 2010-10-06
      相关资源
      最近更新 更多