我编写了一个简单的WCF Web服务,该程序通过编程方式进行配置。它公开了将不同绑定(bind)绑定(bind)到同一合约的三个端点:

  • WebHttpBinding
  • WebHttpRelayBinding(通过Microsoft Azure)
  • myBinding(在其他DLL中的自制绑定(bind))

  • 目前,配置代码非常简单:
    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();
    

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

    我目前的问题是:
  • 在哪里可以找到有值(value)的信息来实现自己的目标?大多数站点只谈论SOAP绑定(bind)-没有关于如何包括非标准绑定(bind)的消息。
  • 是否必须更改MyBinding才能通过app.config接受配置,或者在配置正确时,ServiceModel是否完全像我的编程方法那样调用它?
  • 最佳答案

    好的,所以最重要的是:

  • 地址
  • 绑定(bind)
  • 契约(Contract)

  • 然后再扔一些其他东西。

    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,第二个端点使用自定义绑定(bind)(“MyBinding”)-因此您具有:
    <endpoint address=""
              binding="webHttpBinding"
    <endpoint address="http://azureURL"
              binding="webRelayHttpBinding"
    <endpoint address=""http://someURL"
              binding="myBinding"
    

    并且您需要定义您的自定义绑定(bind):
    <bindings>
      <customBinding>
        <binding name="MyBinding">
          .. define the parameters of your binding here
        </binding>
      </customBinding>
    </bindings>
    

    或为存储在单独程序集中的代码中的绑定(bind)创建<extensions>部分。

    3)合约

    我在任何地方都看不到契约(Contract)-您只能使用typeof(MyService),但是通常这是具体的服务实例,而不是服务契约(Contract),它应该是一个接口(interface)(类似于IMyService)。您为什么没有明确的服务契约(Contract)?

    无论如何,如果您的服务实现也是契约(Contract),同时(不是最佳实践!但可能),那么您将有两个端点,如下所示:
    <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的“学习WCF”,初学者/中级的是“编程WCF”,中级/高级的是Juval Lowy的)。赌注,还有很多经验,真的。我不知道有任何资料可以清楚地显示和教导如何在代码和配置的设置之间进行转换-所提到的两本书通常都以两种方式显示,因此您可以自己弄清楚。

    马克

    关于wcf - 将WCF服务的编程配置转换为配置文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1278332/

    10-12 03:16
    查看更多