在 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
) 中外部化 <service>
标记:
<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
中引用它。
【讨论】:
我有一种感觉,这是我能做到的最好的。谢谢。 我有几个服务,所以我最终将整个以上是关于在 IIS 中托管时如何从代码配置 WCF 服务?的主要内容,如果未能解决你的问题,请参考以下文章
在 IIS 中托管 WCF 服务时如何避免 CommunicationObjectFaultedException?