微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使自托管 WCF 数据服务主机名感知

如何解决使自托管 WCF 数据服务主机名感知

在旧版应用中,我自己托管了 wcf 数据服务(net 4.5)

目前服务多次运行

  • http://+:80/tenant1/service | https://+:443/tenant1/service
  • http://+:80/tenant2/service | https://+:443/tenant2/service
  • ...

现在我想换一种方法

我有以下问题。

到目前为止,我使用 HostNameComparisonMode.StrongWildcard 进行绑定,这适用于旧方法

现在如果我启动两个服务,对 http://tenant1.domain.tldhttp://tenant2.domain.tld 的请求都会由第一个启动的服务响应。

如果我将其更改为 HostNameComparisonMode.Exact,则对 serviceHost.open();调用会阻止我的应用并且该服务不会响应请求。

如果我将其更改为 HostNameComparisonMode.WeakWildcard调用不会阻塞,但服务不会响应请求。

var serviceType = typeof(MyService);
var baseAdresses = new[] { new Uri("http://tenant1.domain.tld/service"),new Uri("https://tenant1.domain.tld/service") };
var serviceHost = new DataServiceHost(serviceType,baseAddresses);

var contract = ContractDescription.GetContract(typeof(IRequestHandler));

foreach (var baseAddress in baseAddresses)
{
    var securityMode = baseAddress.Scheme.Equals("https") ? WebHttpSecurityMode.Transport : WebHttpSecurityMode.None;
    var binding = new WebHttpBinding(securityMode)
    {
        HostNameComparisonMode = HostNameComparisonMode.WeakWildcard,};
    serviceHost.AddServiceEndpoint(
        new ServiceEndpoint(ContractDescription.GetContract(serviceType))
        {
            Name = $"{serviceType..Name}-{baseAddress.Host}-{baseAddress.Port}",Address = new EndpointAddress(baseAddress),Contract = contract,Binding = binding,});
}

serviceHost.open();

  • tenant1.domain.tld 和tenant2.domain.tld 都被转换成我服务器的IP
  • 我使用 url 保留,因为我的服务在没有管理员权限的情况下运行。对于 StrongWildcard / Exact 我必须添加 url acl http://+:80/service 而对于 WeakWildcard 我必须添加 acl http://*:80/service

有什么建议吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。