У меня есть модельный объект, который я отправляю в браузер и отправляю обратно мне. Я хочу, чтобы это значение идентификатора в этом объекте было зашифровано. Я создал собственный JsonConverter, чтобы зашифровать строку и затем расшифровать ее.
public class SecretItem
{
[JsonConverter(typeof(EncryptedIdConverter))]
public string Id { get; set; }
public string Name { get; set; }
}
Это мой класс EncryptedIdConverter
class EncryptedIdConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
string encryptedValue = (string)value;
if (!string.IsNullOrWhiteSpace(encryptedValue))
encryptedValue = Encryption.EncryptString(encryptedValue);
serializer.Serialize(writer, encryptedValue);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
string decryptedString = (string)reader.Value;
if (!string.IsNullOrWhiteSpace(decryptedString))
decryptedString = Encryption.DecryptString(decryptedString);
return decryptedString;
}
public override bool CanConvert(Type objectType)
{
return typeof(string).IsAssignableFrom(objectType);
}
}
Если я попытаюсь вызвать функции JsonConvert.Serialization, все будет работать правильно.
JsonConvert.SerializeObject(secretItem)
JsonConvert.DeserializeObject<SecretItem>([JSON secretItem]);
Когда я возвращаю HttpActionResult Ok(secretItem)
... браузер также получает зашифрованную строку Id.
Однако, когда я отправляю данные обратно на мой контроллер, мой метод webapi не получает дешифрованное свойство. Он пропускает JsonConverter.
public async Task<IHttpActionResult> Post(SecretItem secretItem)
{
// Not decrypted
var decryptedId = secretItem.Id;
}
Почему логика десериализации не работает так же, как логика сериализации в моем WebAPI? Я даже не знаю, с чего начать отладку.
Мы используем Newtonsoft.Json 10.0.0.0, MVC5, .NET Framework 4.6.1.