我的WCF服务公开了https AND和http端点。除了SSL,它们是相同的。它们映射到相同的代码。
最终目的是让外部用户通过https连接,内部用户使用http。
在开发中,这给了我一个问题。 Cassini是VS中打包的开发Web服务器,它讨厌SSL。
我想知道我是否可以从代码配置服务,因此在Cassini下运行时,我不会配置https。
因此问题 - 如果IIS托管,我如何从代码配置服务?对于我如何说服卡西尼不要抱怨配置的https部分,我会非常满意。
答案 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
中引用它。