Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Serilog实现中断其他配置_C#_.net_.net Core_Asp.net Core Webapi_Serilog - Fatal编程技术网

C# 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"

在我们的项目中实现serilog。我们已经实现了AspNetCoreRateLimit,用于对API的Thortle调用。该项目是一个.Net核心项目,但由于某些依赖关系,构建目标是Net461

在serilog之前,api还不错

现在安装serilog后,我们遇到了一个错误

在引入serilog之前,调用此函数会出现错误

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();