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

时间:2010-11-24 17:01:27

标签: wcf iis configuration ssl https

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

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

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

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

因此问题 - 如果IIS托管,我如何从代码配置服务?对于我如何说服卡西尼不要抱怨配置的https部分,我会非常满意。

2 个答案:

答案 0 :(得分:9)

“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托管的环境中使用它来处理以相同方式初始化的几个服务。

答案 1 :(得分:3)

当你在IIS中托管时,你会留下很多关心IIS的领域 - 在这种情况下,你无法抓住你的服务。

IIS会根据您的* .svc文件调整必要的ServiceHost - 真的不是你可以做的很多。

我的解决方案会有所不同 - 外部化配置文件中的<service>标记(web.config):

<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中引用它。