当自托管主机应用程序甚至无法使用它时,在WCF服务本身中定义服务端点的重点是什么

时间:2015-09-04 14:27:27

标签: c# web-services wcf wcf-hosting wcf-behaviour

我是WCF的新手,我还在学习基础知识。到目前为止我学到的是我可以在服务的配置文件中创建服务并配置其端点和行为。当我通过visual studio运行我的服务时,将创建一个默认应用程序,该服务将成功托管在IIS中,一切都很好。

现在,当我为我的服务创建主机应用程序时,我发现我应该在代码中再次为我的服务添加服务端点(和行为),如下所示:

ServiceHost host = new ServiceHost(typeof(HelloService));
host.AddServiceEndpoint(typeof(IHelloWorld), 
                        new WSHttpContextBinding(), 
                        "http://localhost:8873/helloworld/ws");

host.Open();

foreach (var se in host.Description.Endpoints)
{
    Console.WriteLine(se.Address);
}

host.Close();
Console.Read();

或者我可以在宿主应用程序的配置文件中执行此操作

所以这是我的问题:

  1. 在服务器自己的配置文件中,当它在主机应用程序中甚至没用时,有什么意义呢?

  2. 或者服务的配置文件仅适用于IIS和托管主机吗?

  3. 最后是否有办法在主机应用程序中拥有服务自己的配置(不再在主机应用程序中定义端点和行为),或者两个提到的配置完全不同?

  4. 修改

    我的最终问题是如何在主机应用程序中使用 服务的 配置文件中定义的配置?(不使用主机应用程序自己的配置文件或创建其他代码定义新的端点和行为 )

1 个答案:

答案 0 :(得分:1)

  

现在,当我为我的服务创建主机应用程序时,我想通了   我应该为我的服务添加服务端点(和行为)   再次在代码中

这是不正确的。您根本不必在代码中定义服务端点。这就是配置文件的用途。

只需将服务名称(在配置文件中定义)作为类型传入servicehost构造函数:

var host = new ServiceHost(typeof(MyNamespace.MyService));

将配置定义为:

<system.serviceModel>
    <services>
      <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior">
        <endpoint address="MyService"
                  binding="basicHttpBinding"
                  contract="MyNamespace.IMyService" />

        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />

        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8456/"/>
          </baseAddresses>
        </host>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

  </system.serviceModel>

WCF将确定您要使用配置文件来定义要运行的服务。