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

Ric*_*lls 6 iis ssl https configuration wcf

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

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

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

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

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

Chr*_*toD 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"
 %>
Run Code Online (Sandbox Code Playgroud)

将为每个服务命中创建WebServiceHostFactory,并以您希望的方式重新创建主机.

您还需要继承WebServiceHost并以您需要的方式创建它,具有某些终结点,行为,地址等设置 - 无论您喜欢什么.

Michele Bustamante 在这里发帖非常好

编辑:我发现上面的链接不再起作用,所以这里是另一个.

我在IIS托管环境中使用这个以相同方式初始化的几个服务.


mar*_*c_s 3

当您在 IIS 中托管时,您需要对 IIS 领域进行大量关注 - 在这种情况下您无法真正掌握您的服务。

IIS 将负责ServiceHost根据您的 *.svc 文件启动必要的操作 - 实际上您对此无能为力。

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

<system.serviceModel>
  <services>      
     <service configSource="service.dev.config" />
  </services>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

在您的开发环境中,仅公开 http 端点 - 因此您的service.dev.config环境将如下所示:

<service name=".....">
    <endpoint name="default"
              address="....."
              binding="basicHttpBinding" bindingConfiguration="insecure"
              contract="......" />
</service>
Run Code Online (Sandbox Code Playgroud)

创建第二个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>
Run Code Online (Sandbox Code Playgroud)

web.config并在部署服务器上引用它。