我有一个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代理代码生成严重的问题,所以我们就废弃了这个想法。
有没有人知道解决这个问题的方法?我正在拉我的头发!
提前致谢!
请问有没有什么办法可以在端口443上托管你的内部服务?即使使用主机标题,如果有另一个站点已经在443上? – davewasthere 2009-08-08 00:07:55