在 IIS 中托管时如何从代码配置 WCF 服务?

Posted

技术标签:

【中文标题】在 IIS 中托管时如何从代码配置 WCF 服务?【英文标题】:How to configure WCF service from code when hosted in IIS? 【发布时间】:2022-01-25 14:22:46 【问题描述】:

我的 WCF 服务公开了一个 https 和一个 http 端点。除了 SSL,它们是相同的。它们映射到相同的代码。

最终目的是外部用户通过https连接,内部用户使用http。

在开发中,这给了我一个问题。 Cassini,VS打包的开发web服务器,讨厌SSL。

我想知道我是否可以从代码中配置服务,所以在 Cassini 下运行时,我不会配置 https。

因此问题 - 如果服务是 IIS 托管,我如何从代码配置服务?对于如何说服 Cassini 不要抱怨配置的 https 部分的其他答案,我会非常高兴。

【问题讨论】:

【参考方案1】:

“IIS 将根据您的 *.svc 文件处理必要的 ServiceHost ——实际上,您对此无能为力。”

不太接近真相。正是在您的服务的 SVC 文件中,有一个名为 Factory 的属性。您可以在哪里指定类和类所在的组件。这个类可能是你自己的 Web|DataServiceHostFactory 的后代 所以你的 svc 标记看起来像这样

<%@ ServiceHost 
Language="C#"
 Debug="true" 
 Service="name.space.myService" 
 CodeBehind="name.space.myService.svc.sc" 
 Factory = "name.space.WebServiceHostFactoryEx, assembly.name"
 %>

将为每个服务命中创建 WebServiceHostFactory,并以您想要的方式重新创建您的主机。

您还需要继承 WebServiceHost 并使用某些端点、行为、地址等设置以您需要的方式创建它 - 无论您喜欢什么。

Michele Bustamante here 的帖子非常好

编辑:我发现上面的链接不再有效,所以这里是another one。

我在 IIS 托管环境中将它用于以相同方式初始化的几个服务。

【讨论】:

【参考方案2】:

当您在 IIS 中进行托管时,您需要对 IIS 领域进行大量关注 - 在这种情况下,您无法真正掌握您的服务。

IIS 将根据您的 *.svc 文件处理必要的ServiceHost - 真的,您对此无能为力。

我的解决方案会有所不同 - 在您的配置文件 (web.config) 中外部化 &lt;service&gt; 标记:

<system.serviceModel>
  <services>      
     <service configSource="service.dev.config" />
  </services>
</system.serviceModel>

在您的开发环境中,仅公开 http 端点 - 所以您的 service.dev.config 看起来像这样:

<service name=".....">
    <endpoint name="default"
              address="....."
              binding="basicHttpBinding" bindingConfiguration="insecure"
              contract="......" />
</service>

创建第二个 service.prod.config,然后包含两个端点 - http 和 https:

<service name=".....">
    <endpoint name="default"
              address="....."
              binding="basicHttpBinding" bindingConfiguration="insecure"
              contract="......" />
    <endpoint name="secure"
              address="....."
              binding="basicHttpBinding" bindingConfiguration="secure"
              contract="......" />
</service>

并在部署服务器上的 web.config 中引用它。

【讨论】:

我有一种感觉,这是我能做到的最好的。谢谢。 我有几个服务,所以我最终将整个 部分外部化。 web.config 的 xml intellisense 似乎说您不能在服务标签上使用 configSource。我忽略了智能感知,它可以工作。 @RichardHowells:是的,Visual Studio 智能感知在这方面并没有那么智能 - 但它确实有效,正如您所见 :-)

以上是关于在 IIS 中托管时如何从代码配置 WCF 服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 IIS 托管的 WCF 服务启动进程?

IIS托管WCF服务:集成测试和代码覆盖

在 IIS 中托管 WCF 服务时协议映射错误

在 IIS 中托管 WCF 服务时如何避免 CommunicationObjectFaultedException?

如何从 Azure Web 应用程序与 IIS 中本地托管的 WCF 服务进行通信?

如何结合调试 Azure 应用服务和 IIS 托管的 WCF?