/// <summary>Get a server protocol's signature</summary> /// <param name="clientMethodsHashCode">client protocol methods hashcode</param> /// <param name="serverVersion">server protocol version</param> /// <param name="protocol">protocol</param> /// <returns>the server's protocol signature</returns> public static ProtocolSignature GetProtocolSignature(int clientMethodsHashCode, long serverVersion, Type protocol) { // try to get the finger print & signature from the cache ProtocolSignature.ProtocolSigFingerprint sig = GetSigFingerprint(protocol, serverVersion ); // check if the client side protocol matches the one on the server side if (clientMethodsHashCode == sig.fingerprint) { return(new ProtocolSignature(serverVersion, null)); } // null indicates a match return(sig.signature); }
/// <summary>Return a protocol's signature and finger print from cache</summary> /// <param name="protocol">a protocol class</param> /// <param name="serverVersion">protocol version</param> /// <returns>its signature and finger print</returns> private static ProtocolSignature.ProtocolSigFingerprint GetSigFingerprint(Type protocol , long serverVersion) { string protocolName = RPC.GetProtocolName(protocol); lock (ProtocolFingerprintCache) { ProtocolSignature.ProtocolSigFingerprint sig = ProtocolFingerprintCache[protocolName ]; if (sig == null) { int[] serverMethodHashcodes = GetFingerprints(protocol.GetMethods()); sig = new ProtocolSignature.ProtocolSigFingerprint(new ProtocolSignature(serverVersion , serverMethodHashcodes), GetFingerprint(serverMethodHashcodes)); ProtocolFingerprintCache[protocolName] = sig; } return(sig); } }