2009-02-12 107 views
3

我有一个WCF服务,它是一个企业级的防火墙,这是做两个主机名和端口转换的背后,例如:如何在防火墙后面设置安全的WCF服务?

https://ws.address.com/Service.svc - >https://serv.internal.com:44000/Service.svc

该服务采用SSL安全-128和要求客户证书。

因为内部服务器名称是不是从防火墙外部访问,我们必须实现一个ServiceHostFactory翻译的WSDL和XSD导入引用了WCF生成:

public class MyCustomFactory : ServiceHostFactory 
    { 
     protected override ServiceHost CreateServiceHost(
      Type serviceType, Uri[] baseAddresses) 
     { 
      MyCustomHost customServiceHost = 
       new MyCustomHost(serviceType, baseAddresses); 

      return customServiceHost; 
     } 

     class MyCustomHost : ServiceHost 
     { 
      public MyCustomHost(Type serviceType, 
       params Uri[] baseAddresses) 
       : base(serviceType, 
        GetBaseAddresses(serviceType, baseAddresses)) 
      {     
      } 

      protected override void ApplyConfiguration() 
      { 
       base.ApplyConfiguration(); 
      } 

      private static Uri[] GetBaseAddresses(
       Type serviceType, params Uri[] baseAddresses) 
      { 
       UriBuilder newBaseAddress = new UriBuilder(); 
       newBaseAddress.Path = "/" + serviceType.ToString() + 
        ".svc"; 

       // from config 
       newBaseAddress.Host = 
        MyCustomSettings.ServiceBaseAddress; 

       if (baseAddresses.Length > 0) 
       { 
        newBaseAddress.Scheme = baseAddresses[0].Scheme; 
       } 

       return new Uri[] { newBaseAddress.Uri }; 
      } 
     } 
    } 

下面是这个问题:除非服务是443默认SSL端口上的内部机器上托管,我们得到如下错误:

没有协议绑定指定的地址“https://ws.address.com/Service.svc”相匹配。协议绑定在IIS或WAS配置中的站点级别配置。

从修补程序看来,如果我们将内部服务器更改为在443上托管服务或将防火墙配置为从44000转发到44000,则一切正常。但是,这些不是我们生产环境中的选择。

编辑:忘了提,我们试图用一个IWsdlExportExtension扁平化WSDL,但导致在SvcUtil工具或VS2008代理代码生成严重的问题,所以我们就废弃了这个想法。

有没有人知道解决这个问题的方法?我正在拉我的头发!

提前致谢!

+0

请问有没有什么办法可以在端口443上托管你的内部服务?即使使用主机标题,如果有另一个站点已经在443上? – davewasthere 2009-08-08 00:07:55

回答

0

你有没有试图把在地址的IP端口(从问题它看起来并不像它被用来每次):

https://ws.address.com:44000/Service.svc 

另一件事,可能就是, WCF侦听HTTPS流量在该端口上,请参阅:

http://msdn.microsoft.com/en-us/library/ms733768.aspx

+0

我认为问题在于,实时环境需要防火墙将ws.address.com:443的请求转发到内部地址serv.internal.com:44000 – davewasthere 2009-08-08 00:04:57

0

你不应该改变基本addresse在工厂里。写一个扩展来修改WSDL。这将是一个“IWsdlExportExtension”,你想覆盖ExportEndpoint来修改端点地址。这将使您的服务倾听正确的基地址。

OR

如果你不湾开始使用一个WSDL扩展...移动你的代码到“CreateServiceHost”的方法,并划伤您的自定义的主机!这不是很好,但应该工作。

0

你没有提到你的主机。 IIS/WAS?如果是这样,您可能需要将外部主机名添加到IIS配置到安全绑定列表。

here is some information on changing the host-name in IIS hosted service

这里是命令行:

cscript //nologo %systemdrive%\inetpub\adminscripts\adsutil.vbs 
set W3SVC/1/SecureBindings "10.(internal addr).1:443:ws.address.com" 
"127.0.0.1:443:Internal Host name" 

如果不照顾它我会去用“routeNpingme”,并建议你只需要获得指定端点正确使用指定您的https端口和名称的绑定。我认为你可以用现有的绑定选项来做到这一点...但你可能需要创建一个自定义。

0

我的猜测是,托管服务在IIS中的站点的站点绑定配置为仅主机serv.internal.com听,而不是外部名称ws.address.com

如果IIS站点绑定配置了主机名,则会根据所有传入的URL检查该主机名。只有具有匹配主机名的URL才能被该绑定处理。

防火墙将请求重定向到内部服务器,但不会改变传入的URL字符串...