Решение 1
Просто удалите атрибут [Serializable]
из UserModel
, и все будет работать нормально.
Решение 2
При сериализации данных на клиенте используйте поведение сериализации json, как Web API
делает
var serializedData = JsonConvert.SerializeObject(data, new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver
{
IgnoreSerializableAttribute = false
}
});
Теперь Web API
будет правильно десериализовать переданную модель.
Это происходит из-за запуска с некоторой версии Json.NET
считает, что объект помечен как Serializable
.По умолчанию без этого атрибута все открытые члены (свойства и поля) сериализуются.Сериализация следующего класса
public class UserModel
{
public string Username { get; set; }
public string Password { get; set; }
}
дает следующий результат
{
"Username": "name",
"Password": "pass"
}
Но когда класс помечен атрибутом [Serializable]
и значение IgnoreSerializableAttribute
равно false
, все частные и открытыеполя сериализуются, и в результате получается следующее
{
"<Username>k__BackingField": "name",
"<Password>k__BackingField": "pass"
}
По умолчанию сериализатор игнорирует атрибут [Serializable]
, но в Web API
IgnoreSerializableAttribute
имеет значение false
.Теперь легко понять, почему сервер не может правильно десериализовать данную модель в вашем случае.