使用app.Config文件的自托管WCF服务

时间:2018-07-01 06:09:24

标签: c# .net wcf

我有一个自托管的WCF服务,其中包含它自己的app.Config,以公开服务合同所需的端点。如果该服务是通过programs.cs main方法启动的,则一切正常,并且元数据通过浏览器公开。但是,我基于ServiceBase类创建了一个HostService类,该类位于同一主机库中,并在program.cs文件中实例化。 HostService类启动服务,并具有计时器方法来ping其他客户端Web服务以获取信息。

我的问题是,当我创建HostService:ServiceBase类并从main()实例化它时,我必须在服务库中放置一个重复的app.Config文件,以使端点正确公开并返回元数据/ wsdl。如果可能,我不想维护2个重复的app.config文件。当前,主机库和服务库都需要一个。有没有办法只有一个带主机的主机可用于两者?抱歉,您的问题很愚蠢,但我是WCF的新手=)

Program.cs

static void Main(string[] args){
  var service = new HostService(); 
  service.StartHostService(args);   
}

HostService.cs

public partial class HostService : ServiceBase
{
    internal void StartHostService(string[] args)
    {
        this.OnStart(args);
        Console.ReadLine();
        this.OnStop();
    }

    ....
}

1 个答案:

答案 0 :(得分:0)

简短的回答是否定的。必须有两个配置,一个用于使用WCF的客户端,一个用于使用WCF公开该通信方法的服务器。

为了使您的客户端正常工作,必须使用Client Configuration

设置您的配置
<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
  <system.serviceModel>  
        <client>  
          <endpoint  
            name="endpoint1"  
            address="http://localhost/ServiceModelSamples/service.svc"  
            binding="wsHttpBinding"  
            bindingConfiguration="WSHttpBinding_IHello"  
            behaviorConfiguration="IHello_Behavior"  
            contract="IHello" >  

            <metadata>  
              <wsdlImporters>  
                <extension  
                  type="Microsoft.ServiceModel.Samples.WsdlDocumentationImporter, WsdlDocumentation"/>  
              </wsdlImporters>  
            </metadata>  

            <identity>  
              <servicePrincipalName value="host/localhost" />  
            </identity>  
          </endpoint>  
// Add another endpoint by adding another <endpoint> element.  
          <endpoint  
            name="endpoint2">  
           //Configure another endpoint here.  
          </endpoint>  
        </client>  

//The bindings section references by the bindingConfiguration endpoint attribute.  
    <bindings>  
      <wsHttpBinding>  
        <binding name="WSHttpBinding_IHello"   
                 bypassProxyOnLocal="false"   
                 hostNameComparisonMode="StrongWildcard">  
          <readerQuotas maxDepth="32"/>  
          <reliableSession ordered="true"   
                           enabled="false" />  
          <security mode="Message">  
           //Security settings go here.  
          </security>  
        </binding>  
        <binding name="Another Binding"  
        //Configure this binding here.  
        </binding>  
          </wsHttpBinding>  
        </bindings>  

//The behavior section references by the behaviorConfiguration endpoint attribute.  
        <behaviors>  
            <endpointBehaviors>  
                <behavior name=" IHello_Behavior ">  
                    <clientVia />  
                </behavior>  
            </endpointBehaviors>  
        </behaviors>  

    </system.serviceModel>  
</configuration> 

注意<client>标签,该标签指定客户端必须如何调用WCF。

以及Server Config

<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
 <system.serviceModel>  
  <bindings>  
    <basicHttpBinding>  
     <binding name="myBindingConfiguration1" closeTimeout="00:01:00" />  
     <binding name="myBindingConfiguration2" closeTimeout="00:02:00" />  
     <binding closeTimeout="00:03:00" />  <!—- Default binding for basicHttpBinding -->  
    </basicHttpBinding>  
     </bindings>  
     <services>  
      <service name="MyNamespace.myServiceType">  
       <endpoint   
          address="myAddress" binding="basicHttpBinding"   
          bindingConfiguration="myBindingConfiguration1"  
          contract="MyContract"  />  
       <endpoint   
          address="myAddress2" binding="basicHttpBinding"   
          bindingConfiguration="myBindingConfiguration2"  
          contract="MyContract" />  
       <endpoint   
          address="myAddress3" binding="basicHttpBinding"   
          contract="MyContract" />  
       </service>  
      </services>  
    </system.serviceModel>  
</configuration>  

请注意,这里没有<client>标签。