ASP.NET WebAPI序列化问题

时间:2018-06-06 15:13:34

标签: c# asp.net asp.net-web-api serialization

我有一个问题,我无法追踪我的WebAPI项目的起源。 API一直在工作,但是,在部署时我发现我收到了一个与对象序列化有关的错误,暗示我需要在类和DataContract属性上的每个可序列化属性上有DataMember属性。 / p>

我已经应用了这些属性,但是,我仍然看到错误。

出现错误的代码是:

[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 “ ”堆栈跟踪“:”   at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object   目标)\ r \ n at   Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter   writer,Object value,JsonContainerContract contract,JsonProperty   成员,JsonProperty财产,JsonContract&amp; memberContract,Object&amp;   memberValue)\ r \ n at ...

我已经看到了类似错误消息的实例,但是,听起来大多数这些都是通过添加DataContract属性来解决的,这些属性在这里没有帮助。

有没有其他人看过这个,或者任何人都可以帮助解决这个问题?

1 个答案:

答案 0 :(得分:1)

看起来您的问题可能是您正在响应中创建响应...您创建了一个响应,如果不是null,请尝试使用原始响应创建另一个响应。所以,我想它正在尝试序列化原始响应,而不是你的对象。