У меня проблема, происхождение которой я не могу отследить в моем проекте WebAPI. Однако API работал, при развертывании я обнаружил, что получаю ошибку, относящуюся к сериализации объекта, которая подразумевала, что мне нужен атрибут DataContract для класса и атрибуты DataMember для каждого сериализуемого свойства.
Я применил эти атрибуты, но все еще вижу ошибку.
Код ошибки:
[ResponseType(typeof(PortalUser))]
public HttpResponseMessage Get([FromUri]int userId)
{
var user = Request.CreateResponse(repository.GetById(userId));
if (user != null)
return Request.CreateResponse(user);
return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Not found");
}
Где PortalUser определяется как:
[Serializable]
[DataContract]
public class PortalUser : IUser<string>
{
public PortalUser() { }
[DataMember]
public string Id { get; set; }
[DataMember]
public string EmailAddress { get; set; }
[DataMember]
public string MobileTelephone { get; set; }
[DataMember]
public string Firstname { get; set; }
[DataMember]
public string Surname { get; set; }
[DataMember]
public string Company { get; set; }
[DataMember]
public string HashedPassword { get; set; }
[DataMember]
public string PasswordSalt { get; set; }
[DataMember]
public byte[] AuthenticatorQrCodeImage { get; set; }
[DataMember]
public string AuthenticatorFallbackCode { get; set; }
[DataMember]
public int FailedLoginCount { get; set; }
[DataMember]
public DateTime LastFailedLoginAttempt { get; set; }
[DataMember]
public string ManagerId { get; set; }
[DataMember]
public string UserName { get { return EmailAddress; } set { EmailAddress = value; } }
[DataMember]
public string TwoFactorAuthenticationSecretKey { get; set; }
}
Как видите, я уже пытался добавить атрибуты, предложенные в ошибке (Ошибка 1 ниже). Я также попытался удалить XmlMediaFormatter, который затем начал выдавать ошибки о невозможности доступа к ReadTimeout в потоке (ошибка 2 ниже).
Ошибка 1:
Type 'System.Net.Http.ObjectContent`1[PolicyService.Common.Models.PortalUser]' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. If the type is a collection, consider marking it with the CollectionDataContractAttribute. See the Microsoft .NET Framework documentation for other supported types.
Ошибка 2:
"Message":"An error has occurred.","ExceptionMessage":"Error getting value from 'ReadTimeout' on 'Microsoft.Owin.Host.SystemWeb.CallStreams.InputStream'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":" at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)\r\n at ...
Я видел случаи подобных сообщений об ошибках, однако похоже, что большинство из них были решены путем добавления атрибутов DataContract, которые здесь не помогли.
Кто-нибудь еще видел это, или кто-нибудь может помочь пролить свет на проблему?
Неловко. Именно в этом и заключалась проблема. Не заметил его для поиска. Я смотрел на тот же кусок кода большую часть сегодняшнего дня. Если вы перепишете это как ответ, я отмечу это как ответ.
готово ... сам был там.





Похоже, ваша проблема может заключаться в том, что вы создаете ответ из ответа ... Вы создаете ответ, а затем, если он не равен нулю, попробуйте создать другой ответ с исходным ответом. Итак, я полагаю, что он пытается сериализовать исходный ответ, а не ваш объект.
Я не знаю, является ли это вашей проблемой, но похоже, что вы создаете ответ из ответа ... Вы создаете ответ, а затем, если он не равен нулю, попробуйте создать другой ответ с исходным ответом.