在ASP.NET Core

时间:2017-04-04 13:20:06

标签: c# asp.net-core rabbitmq

在我的ASP.NET核心项目中,我在ILoggerFactory上编写了一个添加自定义ILoggerProvider的扩展。 (类似于NLog.Extensions.Logging

我在Startup.cs中添加了这个:

loggerFactory.AddRabbitLogger(Configuration.GetSection(nameof(WebLoggerOptions)));

日志记录工作正常,但它会向RabbitMQ发送消息,这意味着它会打开一个连接和一个通道。这些内容无法保持打开状态,因此我会关闭Dispose中的频道和连接(ILoggerProvider已经继承自IDisposable

我的测试成功,但问题是我的测试输出始终显示此错误

Error while unloading appdomain. (Exception from HRESULT: 0x80131015)

另一个问题是,测试完成后需要几秒钟才能显示错误,因此无法启动任何新测试。

有没有办法在我的测试中触发记录器提供程序的处理?

这是我的集成测试的代码。如您所见,我正在TearDown

进行处理

整合测试

public abstract class TestBase
{
    private TestServer _server;
    protected HttpClient TestHttpClient { get; private set; }

    [SetUp]
    protected void BaseSetup()
    {
        _server = new TestServer(new WebHostBuilder()
            .UseStartup<Startup>());
        TestHttpClient = _server.CreateClient();
    }       

    [TearDown]
    public void TearDown()
    {
        TestHttpClient.Dispose();
        _server.Dispose();
    }
}

public class MyTestClass : TestBase
{
    [Test]
    public async Task SendTest()
    {
        requestUrl = "api/ControllerName/Mehthod";
        var response = await TestHttpClient.PostAsync(requestUrl, pardotFormCommand, GetMediaTypeFormatter());
        response.StatusCode.Should().Be(HttpStatusCode.OK);            
    }        
}

1 个答案:

答案 0 :(得分:0)

我可以通过更改position: sticky; bottom: 0; 扩展程序库来解决此问题。 我也遇到了使用此扩展的控制台应用程序的问题,但仅当我使用多个具有ILoggerFactory实现的服务时。

在提供程序中(派生自ILogger),有ILoggerProvider方法。我发现在一个提供程序中你可以拥有多个记录器(例如,每个asp.net控制器一个或控制台应用程序中的每个服务)。我错误地认为每个记录器都有它自己的提供者,我只处理了一个CreateLogger(最后一个)。

当我将ILogger代码更改为此代码时,我的单元测试中不再出现挂起或错误

ILoggerProvider

简而言之,如果您想编写一个需要处理public ILogger CreateLogger(string categoryName) { var companyLogger = new CompanyLogger(categoryName, _loggerOptions); _companyLoggers.Add(companyLogger); return companyLogger; } public void Dispose() { foreach (var logger in _companyLoggers) { logger.Dispose(); } } 类的自定义ILoggerFactory,您必须将ILogger个对象保留在您的私有列表中ILogger并在调用ILoggerProvider时将它们全部丢弃。如果您的Dispose不需要像NLog一样处理,则不必担心这一点。