C# Serilog实现中断其他配置
在我们的项目中实现serilog。我们已经实现了AspNetCoreRateLimit,用于对API的Thortle调用。该项目是一个.Net核心项目,但由于某些依赖关系,构建目标是Net461 在serilog之前,api还不错 现在安装serilog后,我们遇到了一个错误 在引入serilog之前,调用此函数会出现错误C# Serilog实现中断其他配置,c#,.net,.net-core,asp.net-core-webapi,serilog,C#,.net,.net Core,Asp.net Core Webapi,Serilog,在我们的项目中实现serilog。我们已经实现了AspNetCoreRateLimit,用于对API的Thortle调用。该项目是一个.Net核心项目,但由于某些依赖关系,构建目标是Net461 在serilog之前,api还不错 现在安装serilog后,我们遇到了一个错误 在引入serilog之前,调用此函数会出现错误 services.Configure<IpRateLimitOptions>(_configuration.GetSection("IpRateLimiting"
services.Configure<IpRateLimitOptions>(_configuration.GetSection("IpRateLimiting"));
下面是Configure()中的
来自services.Configure()的错误是:
发生System.TypeLoadException
HResult=0x80131522
Message=程序集“Microsoft.Extensions.Options.ConfigurationChangeTokenSource”“1”中类型“Microsoft.Extensions.Options.ConfigurationExtensions,Version=1.1.2.0,Culture=neutral,PublicKeyToken=adb9793829ddae60”中的方法“get\u Name”没有实现。
Source=Microsoft.Extensions.Options.ConfigurationExtensions
堆栈跟踪:
在Microsoft.Extensions.DependencyInjection.OptionConfigurationServiceCollectionExtensions.Configure[Topions](iSeries收集服务,IConfiguration配置)
在C:\Users\saynort\Documents\Repos\NGB.IFS.PurchApp\NGB.IFS.PurchApp\NGB.IFS.PurchApp\NGB.IFS.PurchApp.Services\Startup.cs中的NGB.IFS.Startup.ConfigureServices(IServiceCollection Services):第86行
我安装了serilog、serilog.extensions.logging和serilog.sinks.file Nuget软件包。来自:
ASP.NET Core 2.0应用程序应首选,而应使用serilog()
删除Serilog和Serilog.Extensions.Logging包。然后,使用以下方法安装Serilog.AspNetCore包:
PM> Install-Package Serilog.AspNetCore -DependencyVersion Highest
若您需要使用AspNetCoreRateLimit实现serilog的示例,我确实重写了它并使其工作
public static class RateLimitSerilogExtensions
{
public static IApplicationBuilder UseCustomIpRateLimiting(this IApplicationBuilder builder)
{
return builder.UseMiddleware<IpRateLimitMiddlewareCustom>();
}
}
public class IpRateLimitMiddlewareCustom : IpRateLimitMiddleware
{
private readonly Microsoft.Extensions.Logging.ILogger _logger;
private readonly IHostEnvironment _env;
private readonly ILogger _serilogger;
public IpRateLimitMiddlewareCustom(RequestDelegate next, IOptions<IpRateLimitOptions> options, IRateLimitCounterStore counterStore, IIpPolicyStore policyStore, Microsoft.Extensions.Logging.ILogger<IpRateLimitMiddleware> logger, IRateLimitConfiguration config,
IHostEnvironment env, ILogger serLog) : base(next, options, counterStore, policyStore, config, logger)
{
_logger = logger;
_serilogger = serLog;
_env = env;
}
protected override void LogBlockedRequest(HttpContext httpContext, ClientRequestIdentity identity, RateLimitCounter counter, RateLimitRule rule)
{
_serilogger
.ForContext("Blocked by rule", rule.Endpoint)
.ForContext("TraceIdentifier", httpContext.TraceIdentifier)
.ForContext("Quota", rule.Limit + "/" + rule.Period)
.ForContext("Exceeded By", counter.Count)
.Information("EService limit reached");
}
}
非常感谢。我会试试看它是否更无缝!我试过了,但我担心这个解决方案只有在.NETCore2项目中才有效。这不是。如果我尝试升级,由于构建和依赖关系,我可能会出现以下错误:我得到的错误是“Package Microsoft.AspNetCore.All 2.0.0与net461不兼容”。这是我的目标版本,因为我必须包含依赖项(第三方)。我一定是疯了,因为我可以发誓你在你的问题中提到过使用ASP.NET Core 2.0。无论如何,你最好还是升级一下。NETCore2.0实现了.NET标准2.0,这意味着您现在几乎可以使用任何.NETFramework库。因此,实际上不再需要在完整的框架上运行,除非您所引用的库确实执行了一些特定于Windows的内容。我认为某种形式的混合在这里起了作用:而不是包含.All核心依赖项。我有AspNetCore、AspNetCore.Mvc.Core和AspNetCore.Mvc.Formatters.Json。最终结果是核心2 Nuget包,但没有错误目标net461。但是,我不得不从启动中删除services.AddMVC(),因为它引发了一个“未实现”异常。我已经有了services.AddMvcCore(),但是,只要一切都正常运行就行了。老实说,我很高兴工作,日志也在工作,但不确定我做了什么,以及它的影响!关于你的评论。恐怕我别无选择,只能瞄准461全脂,以便使用第三方供应商。你如何看待这种看似混合的方法。我必须说,我有点困惑为什么这样做,因为提到的组件是2.0.0版本。只需删除AddMVC()
PM> Install-Package Serilog.AspNetCore -DependencyVersion Highest
public static class RateLimitSerilogExtensions
{
public static IApplicationBuilder UseCustomIpRateLimiting(this IApplicationBuilder builder)
{
return builder.UseMiddleware<IpRateLimitMiddlewareCustom>();
}
}
public class IpRateLimitMiddlewareCustom : IpRateLimitMiddleware
{
private readonly Microsoft.Extensions.Logging.ILogger _logger;
private readonly IHostEnvironment _env;
private readonly ILogger _serilogger;
public IpRateLimitMiddlewareCustom(RequestDelegate next, IOptions<IpRateLimitOptions> options, IRateLimitCounterStore counterStore, IIpPolicyStore policyStore, Microsoft.Extensions.Logging.ILogger<IpRateLimitMiddleware> logger, IRateLimitConfiguration config,
IHostEnvironment env, ILogger serLog) : base(next, options, counterStore, policyStore, config, logger)
{
_logger = logger;
_serilogger = serLog;
_env = env;
}
protected override void LogBlockedRequest(HttpContext httpContext, ClientRequestIdentity identity, RateLimitCounter counter, RateLimitRule rule)
{
_serilogger
.ForContext("Blocked by rule", rule.Endpoint)
.ForContext("TraceIdentifier", httpContext.TraceIdentifier)
.ForContext("Quota", rule.Limit + "/" + rule.Period)
.ForContext("Exceeded By", counter.Count)
.Information("EService limit reached");
}
}
app.UseCustomIpRateLimiting();
app.UseIpRateLimiting();