通过 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 方案异常的主要内容,如果未能解决你的问题,请参考以下文章

NLog 通过http保存日志

NLog写入Mongo日志配置

NLog日志框架使用探究

nlog 通过记录器名称设置全局属性

NLog的介绍使用

Hangfire 没有登录到 NLog