NServiceBus 在 EnclosedMessageTypes 元数据中使用类型全名

NServiceBus use type full name in EnclosedMessageTypes metadata

NServiceBus 包含带有消息 "NServiceBus.EnclosedMessageTypes" 的元 Header。 它将序列化类型的 AssemblyQualifiedName 放在那里。

例如:MyNamespance.MyType, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7777777777777777

我可以让 NServiceBus 只使用 FullName 吗?

例如:MyNamespance.MyType 而不是 AssemblyQualifiedName。

用例: 系统代码的某些遗留部分需要签名的程序集。出于这个原因,我不想签署所有程序集。因此,作为黑客程序集,仅在遗留应用程序中自签名。但是当来自在遗留应用程序 NServiceBus 中序列化的共享合同包的消息在没有签名程序集的情况下无法反序列化它们。

'NServiceBus.MessageDeserializationException: An error occurred while attempting to extract logical messages from transport message 99999999-9999-99999-9999-999999999999 ---> Newtonsoft.Json.JsonSerializationException: Type specified in JSON 'MyNamespance.MyType, MyAssembly' was not resolved. Path '[0].$type', line 9, position 999.'

答案在于 IMutateTransportMessages 或更具体地说,在这种情况下 IMutateOutgoingTransportMessages

它允许更改 headers,因此我可以剥离 PublicToken,因此程序集看起来未签名。

public class EnclosedMessageTypeMutator : IMutateOutgoingTransportMessages
{
    public void MutateOutgoing(LogicalMessage logicalMessage, TransportMessage transportMessage)
    {
        var header = transportMessage.Headers["NServiceBus.EnclosedMessageTypes"];
        header = header.Substring(0, header.LastIndexOf("=", StringComparison.InvariantCulture) + 1) + "null";
        transportMessage.Headers["NServiceBus.EnclosedMessageTypes"] = header;
    }
}

别忘了注册它:

   components.ConfigureComponent<EnclosedMessageTypeMutator>(DependencyLifecycle.InstancePerCall);