Проблемы с сериализацией ASP.NET WebAPI - PullRequest
0 голосов
/ 06 июня 2018

У меня есть проблема, из-за которой я не могу проследить происхождение в моем проекте 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:

Тип 'System.Net.Http.ObjectContent`1 [PolicyService.Common.Models.PortalUser]' не может быть сериализован.Попробуйте пометить его атрибутом DataContractAttribute и пометить все его элементы, которые вы хотите сериализовать, атрибутом DataMemberAttribute.Если тип является коллекцией, попробуйте пометить его с помощью CollectionDataContractAttribute.Сведения о других поддерживаемых типах см. В документации Microsoft .NET Framework.

Ошибка 2:

"Сообщение": "Произошла ошибка.", "ExceptionMessage": "Ошибка при получении значения из ReadTimeout в Microsoft.Owin.Host.SystemWeb.CallStreams.InputStream '. "," ExceptionType ":" Newtonsoft.Json.JsonSerializationException "," StackTrace ":" в Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue (Цель объекта) \ r \ n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues ​​(Автор записи JsonWriter, Значение объекта, JsonContainerContract, член JsonProperty, свойство JsonProperty, JsonContract & memberContract, Object & member \ nVV)1026 *

Я видел случаи подобных сообщений об ошибках, однако, похоже, что большинство из них были решены путем добавления атрибутов DataContract, которые здесь не помогли.

ИмеетКто-нибудь еще видел это, или кто-нибудь может помочь пролить свет на проблему?

1 Ответ

0 голосов
/ 06 июня 2018

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

...