在IIS 7中托管WCF控制台应用程序

Fra*_* Q. 2 iis wcf iis-7 wcf-hosting

我有一个带有以下app.config文件的WCF控制台应用程序

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="serviceBehavior">
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <netNamedPipeBinding>
        <binding name="namedPipeBindingConfig" maxBufferPoolSize="268435456" maxBufferSize="16777216" maxReceivedMessageSize="16777216" />
      </netNamedPipeBinding>
    </bindings>

    <services>
      <service behaviorConfiguration="serviceBehavior" name="MyTestNamespace.MyTestClassService">
        <endpoint address="net.pipe://localhost/MyService"
          binding="netNamedPipeBinding" bindingConfiguration="namedPipeBindingConfig"
          name="NamedPipeBinding" contract="MyTestNamespace.IMyTestContract" />
      </service>
    </services>
  </system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我将它作为控制台应用程序托管(接口,实现和托管类都在一个项目中),基本上这样做:

ServiceHost host = new ServiceHost(typeof(MyTestClassService));
host.Open();
Run Code Online (Sandbox Code Playgroud)

我从命令提示符"C:\ SomePath \> RunMyService.exe"运行,它启动并运行良好.现在,我打算在IIS 7中托管这个,我没有找到任何关于如何在那里部署(特定的控制台应用程序)的好例子.我的问题很少:

1)我是否需要在IIS中"添加网站"或"添加应用程序"并将我的文件放在那里?

2)我需要一个.svc文件吗?如果是,它必须包含什么,如何告诉它启动此控制台应用程序.

3)这个控制台应用程序会在IIS中运行吗?这是如何运作的 ?

Pau*_*ter 5

是的,您需要在IIS中定义一个网站,以便在IIS中托管您的服务.此外,您实际上不会在此配置中运行控制台应用程序.换句话说,永远不会调用Program.Main函数.相反,IIS将使用自己的ServiceHost实现直接加载MyTestClassService.

虽然可能可以使用您的控制台应用程序二进制与IIS(我可能会说,因为我从来没有真正做到了这一点,但它应该在技术上是可能的),它可能会更有意义,为您将您的服务实现的代码放到一个单独的类库项目.然后,您可以从ServiceHost控制台应用程序和IIS引用类库项目.这对其他开发人员来说不那么容易混淆.在任何情况下,您都必须将包含服务接口和服务定义的二进制文件放入您将托管服务的网站的bin目录中.

当前驻留在app.config文件中的配置必须移动到您网站的web.config文件中,并且您必须使用不同的绑定,因为IIS不支持net.pipe.

您不必使用.svc文件; 如果您愿意,可以使用基于配置的激活.这将允许您设置一个空网站,其中只包含将托管您的服务的web.config文件.

重点是您将不会托管控制台应用程序,您将托管服务.现在您的控制台应用程序充当服务主机; 重新配置IIS时将采用该角色.为了找到更多资源,只需查看有关在IIS上托管WCF的信息; 您目前在控制台应用程序中使用ServiceHost进行托管的事实无关紧要.