Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
Serialization NServiceBus在EnclosedMessageTypes元数据中使用类型全名_Serialization_Nservicebus_Assembly Signing - Fatal编程技术网

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

Serialization NServiceBus在EnclosedMessageTypes元数据中使用类型全名,serialization,nservicebus,assembly-signing,Serialization,Nservicebus,Assembly Signing,NServiceBus包含带有消息“NServiceBus.EnclosedMessageTypes”的元标头。 它将序列化类型的AssemblyQualifiedName放入其中 e、 g.:MyNamespance.MyType,MyAssembly,Version=1.0.0.0,Culture=neutral,PublicKeyToken=7777 我可以让NServiceBus使用只键入全名吗 例如:MyNamespance.MyType而不是AssemblyQualifiedName

NServiceBus包含带有消息“NServiceBus.EnclosedMessageTypes”的元标头。 它将序列化类型的AssemblyQualifiedName放入其中

e、 g.:
MyNamespance.MyType,MyAssembly,Version=1.0.0.0,Culture=neutral,PublicKeyToken=7777

我可以让NServiceBus使用只键入全名吗

例如:
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.'

答案在于
imutateransportmessages
或者更具体地说,在本例中
IMutateOutgoingTransportMessages

它允许更改标题,这样我就可以去掉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);
components.ConfigureComponent(DependencyLifecycle.InstancePerCall);