3

我有一个带有以下 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>

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

ServiceHost host = new ServiceHost(typeof(MyTestClassService));
host.Open();

我从命令提示符“C:\SomePath\>RunMyService.exe”运行,它启动并运行良好。现在,我计划在 IIS 7 中托管它,但我没有找到任何关于如何在此处部署这个(特别是控制台应用程序)的好例子。我的几个问题是:

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

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

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

4

1 回答 1

6

是的,您需要在 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 托管的事实无关紧要。

于 2012-11-01T01:13:05.327 回答