通过 HTTPS 的 NLog LogReceiverService 引发无效的 URI 方案异常
Posted
技术标签:
【中文标题】通过 HTTPS 的 NLog LogReceiverService 引发无效的 URI 方案异常【英文标题】:NLog LogReceiverService over HTTPS throws invalid URI scheme exception 【发布时间】:2014-08-22 11:02:06 【问题描述】:我正在使用 NLog 附带的LogReceiverService
目标来登录到远程日志服务。我的 NLog 配置如下所示:
<target name="loggingservice" type="LogReceiverService" endpointAddress="http://logger:56998/ILoggingService" useBinaryEncoding="False" includeEventProperties="True" />
这很好用。但是,如果我将 endpointAddress 更改为 HTTPS:
<target name="loggingservice" type="LogReceiverService" endpointAddress="https://logger:56998/ILoggingService" useBinaryEncoding="False" includeEventProperties="True" />
然后我得到以下 WCF 异常:
[ArgumentException: The provided URI scheme 'https' is invalid; expected 'http'.
Parameter name: via]
System.ServiceModel.Channels.HttpChannelFactory`1.ValidateCreateChannelParameters(EndpointAddress remoteAddress, Uri via) +17130141
System.ServiceModel.Channels.HttpChannelFactory`1.OnCreateChannelCore(EndpointAddress remoteAddress, Uri via) +52
System.ServiceModel.Channels.ChannelFactoryBase`1.InternalCreateChannel(EndpointAddress address, Uri via) +116
System.ServiceModel.Channels.ServiceChannelFactoryOverRequest.CreateInnerChannelBinder(EndpointAddress to, Uri via) +29
System.ServiceModel.Channels.ServiceChannelFactory.CreateServiceChannel(EndpointAddress address, Uri via) +32
System.ServiceModel.Channels.ServiceChannelFactory.CreateChannel(Type channelType, EndpointAddress address, Uri via) +100
System.ServiceModel.ChannelFactory`1.CreateChannel(EndpointAddress address, Uri via) +564
System.ServiceModel.ClientBase`1.CreateChannel() +58
System.ServiceModel.ClientBase`1.CreateChannelInternal() +48
System.ServiceModel.ClientBase`1.get_Channel() +464
NLog.LogReceiverService.WcfLogReceiverClient.NLog.LogReceiverService.ILogReceiverClient.BeginProcessLogMessages(NLogEvents events, AsyncCallback callback, Object asyncState) +21
System.ServiceModel.ClientBase`1.InvokeAsync(BeginOperationDelegate beginOperationDelegate, Object[] inValues, EndOperationDelegate endOperationDelegate, SendOrPostCallback operationCompletedCallback, Object userState) +249
我可以在浏览器中访问https://logger:56998
,它会在收到有关不受信任的证书的警告后正常加载。
我在this post 中尝试了一些建议的绑定配置,但它们都没有任何区别。另外,这些答案都没有真正解释发生了什么,只是关于如何解决它的想法。
【问题讨论】:
【参考方案1】:终于想通了。基本上,我用我的自定义版本覆盖了LogReceiverWebServiceTarget
中的CreateWcfLogReceiverClient
:
protected override WcfLogReceiverClient CreateWcfLogReceiverClient()
EndpointAddress address = new EndpointAddress(EndpointAddress);
HttpBindingBase binding = address.Uri.IsHttps() ? (HttpBindingBase)new BasicHttpsBinding() : new BasicHttpBinding();
return new WcfLogReceiverClient(binding, address);
这也可以通过提供EndpointConfigurationName
来完成,但我在三个小时后试图弄清楚这一点后放弃了。
但是,还是不行。我不会得到任何例外,但没有发送消息。我能够通过启用 WCF 跟踪来追踪这一点,这表明 SSL 证书存在问题。
该 URL 在 Chrome 中加载正常,但在 IE 中会提供无效证书警告。看起来 IE 会让你继续,但 WCF 将其视为失败。我终于找到了这个事实,即证书是由我的 IPv4 地址键入的,并且主机名解析为 IPv6 地址。我只需要运行:
netsh http add sslcert ipport=[MyIpv6Address]:91 certhash=<Cert Hash>
然后它在 IE 中加载,以及在 WCF 中运行。
【讨论】:
以上是关于通过 HTTPS 的 NLog LogReceiverService 引发无效的 URI 方案异常的主要内容,如果未能解决你的问题,请参考以下文章