System.TypeLoadException: «Метод get_SerializationSettings» при использовании KeyVault из плагина нагрузочного теста

У меня есть нагрузочный тест, который использует Key Vault для предварительной аутентификации веб-запросов. Как только код пытается вызвать метод, использующий внутри класс KeyVaultClient, возникает следующее исключение:

System.TypeLoadException: «Метод get_SerializationSettings» в типе «Microsoft.Azure.KeyVault.KeyVaultClient» из сборки «Microsoft.Azure.KeyVault, версия = 3.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35» не имеет реализации.

Я попытался понизить версию KeyVault nuget до версии 2.0.6, но получаю ту же ошибку с версией 2.0.0.0.

Я использую .NET framework 4.7.2 и Visual Studio 2017 v.15.9.7.

ОБНОВЛЕНИЕ. Проблема возникает, когда nuget Microsoft.Rest.ClientRuntime nuget (на который ссылается Microsoft.Azure.KeyVault) обновляется до версии 2.3.20. Если откатить на v. 2.3.18, то нагрузочный тест работает нормально.


person Dmitry Pro    schedule 27.02.2019    source источник
comment
Пожалуйста, поделитесь кодовой базой, которую вы пытаетесь.   -  person Mohit Verma    schedule 28.02.2019
comment
Вот ссылка: 1drv.ms/u/s!Aiq7mZR1Cdrpwdd7NJkWyTC4DMzagQ   -  person Dmitry Pro    schedule 28.02.2019


Ответы (1)


Вот что я использовал в своем коде при доступе к клиенту хранилища ключей с помощью библиотеки 3.0.3, и это сработало для меня. попробуйте это ниже и посмотрите, работает ли это.

Uri ADL_TOKEN_AUDIENCE = new Uri(urlAudience);
var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetAccessToken));
public static async Task<string> GetAccessToken(string azureTenantId, string azureAppId, string azureSecretKey)
{
    var context = new AuthenticationContext(ConfigurationManager.AppSettings.Get("Authority") + tenantId);
    ClientCredential clientCredential = new ClientCredential(appId, secretKey);
    var tokenResponse = await context.AcquireTokenAsync(ConfigurationManager.AppSettings.Get("VaultUrl"), clientCredential);
    var accessToken = tokenResponse.AccessToken;
    return accessToken;
}

Попробуйте получить токен таким способом, должно сработать.

person Mohit Verma    schedule 28.02.2019
comment
Это не работает. Исключение появляется при входе в метод, использующий класс KeyVaultClient. Кажется, это происходит во время JIT-компиляции некоторых статических методов в этом классе. - person Dmitry Pro; 28.02.2019