2010-11-24 137 views
6

我的WCF服务公开了一个https和一个http端点。除了SSL,它们是相同的。他们映射到相同的代码。如何在IIS中托管代码时配置WCF服务?

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

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

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

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

回答

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上的部署服务器上。 “

+1

我有一种感觉,这是我能够实现的最好的。谢谢。 – RichardHowells 2010-11-24 18:00:10

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并以您需要的方式通过特定的端点,行为,地址等设置来创建它 - 无论您喜欢什么。

有一个从米歇尔·布斯塔曼特here

非常不错的职位,我在IIS中使用此托管环境对夫妇被初始化同样的服务。