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

6
我的WCF服务暴露了一个https和一个http端点。除了SSL之外,它们是相同的,它们映射到相同的代码。
最终目的是让外部用户通过https连接,内部用户使用http。
在开发中,这给我带来了问题。VS中打包的开发Web服务器Cassini不支持SSL。
我想知道是否可以从代码中配置服务,以便在Cassini下运行时,我不会配置https。
因此问题是 - 如果服务托管在IIS上,我如何从代码中配置服务?如果有其他答案可以说服Cassini不要抱怨配置中的https部分,我将非常高兴。
2个回答

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有一篇非常好的文章这里

编辑:我发现上面的链接已经失效了,所以这里是另一个链接

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


3
当你在IIS中托管时,你将许多照顾的责任交给了IIS——在这种情况下,你不能真正掌握服务。IIS会根据你的*.svc文件来启动必要的ServiceHost,这方面你真的没有太多办法。
我的解决方案则不同——将标签外部化到你的配置文件(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
我有几个服务,所以最终将整个<services>部分外部化。web.config的xml智能感应似乎表明您不能在services标记上使用configSource。我忽略了智能感应,它可以正常工作。 - RichardHowells
@RichardHowells:是的,Visual Studio的智能感知在这方面并不是很智能 - 但它确实可以工作,就像你所看到的一样 :-) - marc_s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接