#.net-core #nservicebus
Вопрос:
Я пытаюсь создать свое первое приложение NServiceBus, но не могу заставить его работать. Сообщение поступает на «серверную часть», но обработчик использует DI, и NServiceBus утверждает, что не может найти службу для интерфейса. Но код был взят непосредственно из примеров. Я что-то упускаю и не могу этого понять.
Ошибка: dbug: NServiceBus.LoadHandlersConnector[0] Тип обрабатываемых сообщений: Сообщения.Заголовки сообщений JobStartCommand: NServiceBus.Идентификатор сообщения : 0044f261-e3b3-4287-b6f0-ad7400ef43cb служебный автобус.MessageIntent : Отправьте NServiceBus.Идентификатор беседы : bb4f276f-63fe-450b-b234-ad7400ef43cd служебный автобус.Идентификатор корреляции : 0044f261-e3b3-4287-b6f0-ad7400ef43cb служебный автобус.Адрес для ответа : ClientUI NServiceBus.Исходная машина : L19002992 NServiceBus.Исходная точка : ClientUI $.диагностика.исходящий.адрес : e1fecb2b72b8185e47341bb4dfb37dd7 NServiceBus.Тип содержимого : текст/xml NServiceBus.Вложенные типы сообщений : Сообщения.Команда JobStart, Сообщения, Версия=1.0.0.0, Культура=нейтральная, PublicKeyToken=null NServiceBus.Версия : 7.5.0 NServiceBus.Время : 2021-07-29 14:31:08:228497 Z NServiceBus.Повторные попытки : 3 NServiceBus.Повторные попытки.Метка времени : 2021-07-29 14:31:40:397277 Обработчики Z для вызова: Экстрактор.Экстрактор JobStartHandler.Информация о JobStartHandler: NServiceBus.Исполнитель восстановления[0] Немедленная повторная попытка приведет к повторению сообщения «0044f261-e3b3-4287-b6f0-ad7400ef43cb» из-за исключения: Система.Исключение InvalidOperationException: Не удается разрешить службу для типа «IExtract» при попытке активировать «Экстрактор».Начинающий работник». в Microsoft.Extensi
Моя серверная программа.cs
using Microsoft.Extensions.Hosting;
using System;
using System.Diagnostics;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NServiceBus;
using System.Threading.Tasks;
using Messages;
using Extractor;
namespace ExtractorOsiris
{
class Program
{
static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
var builder = Host.CreateDefaultBuilder(args);
builder.UseWindowsService();
//builder.UseMicrosoftLogFactoryLogging();
builder.ConfigureLogging((ctx, logging) =>
{
logging.AddConfiguration(ctx.Configuration.GetSection("Logging"));
//logging.AddEventLog();
logging.AddConsole();
logging.SetMinimumLevel(LogLevel.Debug);
});
#region back-end-use-nservicebus
builder.UseNServiceBus(ctx =>
{
var endpointConfiguration = new EndpointConfiguration("Sample.Extractor");
endpointConfiguration.UseTransport<LearningTransport>();
var transport = endpointConfiguration.UseTransport<LearningTransport>();
transport.Routing().RouteToEndpoint(typeof(ProcessObjectCommand), "Sample.Processor");
endpointConfiguration.DefineCriticalErrorAction(OnCriticalError);
return endpointConfiguration;
});
#endregion
#region back-end-register-service
builder.ConfigureServices(services =>
{
services.AddSingleton<IExtract, ExtractOsiris>();
});
#endregion
return builder;
}
private static Task OnCriticalError(ICriticalErrorContext arg)
{
throw new NotImplementedException();
}
}
}
Интерфейс
using Newtonsoft.Json.Linq;
using NServiceBus;
using System;
using System.Threading.Tasks;
namespace Extractor
{
public interface IExtract
{
Task<JArray> Extract(string @object, DateTime deltaTime);
}
}
The handler
using System.Threading.Tasks;
using Messages;
using Newtonsoft.Json.Linq;
using NServiceBus;
namespace Extractor
{
#region back-end-handler
public class JobStartHandler : IHandleMessages<JobStartCommand>
{
private readonly IExtract extractor;
public JobStartHandler(IExtract extractor)
{
this.extractor = extractor;
}
public async Task Handle(JobStartCommand message, IMessageHandlerContext context)
{
Task<JArray> result = extractor.Extract("Medewerkers", message.DeltaTime);
await resu<
JArray test = result.Resu<
foreach (JObject x in test)
{
// send the object to be processed.
//await context.Send(new ProcessObjectCommand(x.ToString()));
}
}
}
#endregion
}
Реализация интерфейса
using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using Extractor;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NServiceBus;
namespace ExtractorOsiris
{
public class ExtractOsiris : IExtract
{
private readonly ILogger logger;
public ExtractOsiris(ILogger<ExtractOsiris> logger)
{
this.logger = logger;
}
public Task<JArray> Extract(string @object, DateTime deltaTime)
{
logger.LogInformation($"getting {@object} for delta time {deltaTime}");
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://xx.yy");
WebResponse response = request.GetResponse();
JObject temp = JObject.Load(new JsonTextReader(new StreamReader(response.GetResponseStream())));
return Task<JArray>.FromResult(temp["items"] as JArray);
}
}
}
Я знаю, что код некрасивый, но это чистый быстрый и грязный код для тестирования.
Комментарии:
1. Похоже, это должно сработать… можете ли вы поделиться фактическим кодом (github?), чтобы я мог попробовать создать его сам?
2. @SeanFarmar, похоже, ты прав. Я вручную очистил папку bin, и она начала работать. Я переименовал некоторые сборки, возможно, там было что-то старое, но я несколько раз убирал….
Ответ №1:
Я очистил оскорбительный интерфейс из кода и все равно получил ошибку в интерфейсе, которого там больше не было. Я удалил папку bin и построил все заново шаг за шагом. Глупость в том, что система управления версиями говорит, что я вернулся к тому, с чего начал, без изменений. И это просто работает….
Так что, должно быть, было что-то глупое с VS2019. Извините всех, кто потратил впустую мое время