如何解决使自托管 WCF 数据服务主机名感知
在旧版应用中,我自己托管了 wcf 数据服务(net 4.5)
目前服务多次运行
- http://+:80/tenant1/service | https://+:443/tenant1/service
- http://+:80/tenant2/service | https://+:443/tenant2/service
- ...
现在我想换一种方法
- http://tenant1.domain.tld:80/service | https://tenant1.domain.tld:443/service
- http://tenant2.domain.tld:80/service | https://tenant2.domain.tld:443/service
- ...
我有以下问题。
到目前为止,我使用 HostNameComparisonMode.StrongWildcard
进行绑定,这适用于旧方法。
现在如果我启动两个服务,对 http://tenant1.domain.tld
和 http://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 aclhttp://+:80/service
而对于WeakWildcard
我必须添加 aclhttp://*:80/service
有什么建议吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。