我正在尝试使用 RawRabbit 实现图像处理服务,该服务将接收要处理的图像并将提取的信息返回到不同的队列。删除所有不必要的代码后,我意识到我面临的问题是当我从订阅委托中调用发布时。
有谁知道我做错了什么?我的应用程序基于.Net core 2.0
以下是我订阅的方法。
public async Task StartListening()
{
try
{
_log.InfoFormat("Preparing to subscribe to queue messages");
LoadConfiguration();
CreateBusClient();
_log.DebugFormat("BusClient created, calling subscribe");
_client.SubscribeAsync<string>((msgStr, context) =>
{
_client.PublishAsync("test", default(Guid), cfg => cfg.WithExchange(exc => exc.WithName("face_process_exchange").WithType(ExchangeType.Direct)).WithRoutingKey("face_process_response"));
return Task.FromResult(true);
}, cfg => cfg.WithExchange(exc => exc.WithName(_configuration.Exchange).WithType(ExchangeType.Direct)).
WithRoutingKey(_configuration.RoutingKeyToListen).
WithQueue(q => q.WithName(_configuration.QueueToListen)).
WithSubscriberId(""));
_log.Info("Subscribed to queue");
}
catch(Exception e)
{
_log.ErrorFormat("Failed to subscribe to queue: {0}", e.ToString());
}
}
这是我创建 BusClient 的方法;
private void CreateBusClient()
{
var busConfig = new RawRabbitConfiguration
{
Username = _configuration.ConnectionUsername,
Password = _configuration.ConnectionPassword,
Port = _configuration.ConnectionPort,
VirtualHost = "/",
Hostnames = { _configuration.Hostname },
RouteWithGlobalId = false
};
_log.DebugFormat("Calling BusClientFactory.CreateDefault for _configuration read as: {0}", _configuration.ToString());
var addCfg = new Action<IServiceCollection>(s => s.AddSingleton(p => busConfig));
var serviceProvider = new ServiceCollection().AddRawRabbit<AdvancedMessageContext>(null, addCfg).BuildServiceProvider();
var cs = serviceProvider.GetService<IBusClient<AdvancedMessageContext>>();
_client = new RawRabbit.vNext.Disposable.BusClient<AdvancedMessageContext>(cs);
}
```
问题是当调用 PublishAsync 时我总是得到以下异常。
System.Runtime.Serialization.SerializationException: Serializing delegates is not supported on this platform.
at System.MulticastDelegate.GetObjectData(SerializationInfo info, StreamingContext context)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeISerializable(JsonWriter writer, ISerializable value, JsonISerializableContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
at RawRabbit.Context.Provider.MessageContextProviderBase1.SerializeContext(TMessageContext messageContext)
at RawRabbit.Context.Provider.MessageContextProviderBase1.GetMessageContext(Guid& globalMessageId)
at RawRabbit.Operations.Publisher1.PublishAsync[TMessage](TMessage message, Guid globalMessageId, PublishConfiguration config)
at RawRabbit.Common.BaseBusClient1.PublishAsync[T](T message, Guid globalMessageId, Action1 configuration)
at RawRabbit.vNext.Disposable.BusClient1.PublishAsync[T](T message, Guid globalMessageId, Action`1 configuration)
at SimpleID.FaceProcessing.Services.Implementation.RawRabbitQueueService.b__11_0(String msgStr, AdvancedMessageContext context)