内部服务器错误;同时在Web API Post方法中序列化JSON

本文关键字:Post API 方法 JSON 序列化 Web 错误 服务器 内部 | 更新日期: 2023-09-27 18:08:53

我有一个使用ASP与客户端通信的服务器。. NET Web API.

我的模型在服务器端更详细,客户端有更少的数据,所以我使用[DataContract]/[DataMember]来匹配两者。

下面是服务器端的模型:

[DataContract]
public class Discussion
{
    public Discussion()
    {
        this.Posts = new HashSet<Post>();
        this.Members = new HashSet<UserProfile>();
    }
    [DataMember]
    public int DiscussionId { get; set; }
    [DataMember]
    public int AuthorId { get; set; }
    public int CategoryId { get; set; }
    [Required]
    [MinLength(4)]
    [MaxLength(140)]
    [DataMember]
    public string DiscussionSubject { get; set; }
    [Required]
    [MinLength(10)]
    [MaxLength(10000)]
    [DataMember]
    public string DiscussionDescription { get; set; }
    [Required]
    [DataMember]
    public DateTime CreateDate { get; set; }

    [Required]
    [DataMember]
    public DateTime LastChangeDate { get; set; }
    [NotMapped]
    [DataMember]
    public int NumberOfPosts { get { return Posts.Count; } }
    [DataMember]
    public virtual UserProfile Author { get; set; }
    public virtual Category Category { get; set; }
    public virtual ICollection<UserProfile> Members { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
}

这是客户端模型:

[DataContract]
public class Discussion
{
    [DataMember]
    public int DiscussionId { get; set; }
    [DataMember]
    public int AuthorId { get; set; }
    [DataMember]
    public string DiscussionSubject { get; set; }
    [DataMember]
    public string DiscussionDescription { get; set; }
    [DataMember]
    public DateTime CreateDate { get; set; }
    [DataMember]
    public DateTime LastChangeDate { get; set; }
    [DataMember]
    public int NumberOfPosts { get; set; }
    [DataMember]
    public virtual UserProfile Author { get; set; }
}

现在,当我发送一个post请求,我得到一个内部服务器错误,甚至没有达到post方法点,而我调试

Discussion discussion = new Discussion
{
    DiscussionSubject = subject,
    DiscussionDescription = description,
};
response = await client.PostAsJsonAsync(requestUri, discussion);
response.EnsureSuccessStatusCode();

我猜问题出在反序列化上,因为当我把模型改成另一个模型时,一切正常。这将很好地知道,当我发送Get请求时,一切都是正常的。

我怎么能解决这个问题,我在哪里可以看到什么是内部服务器错误到底?

EDIT:这是服务器端的Post方法:

public HttpResponseMessage Post(Discussion discussion)

我希望反序列化在这里自动发生(从接收到的客户端Discussion到服务器Discussion)。

内部服务器错误;同时在Web API Post方法中序列化JSON

我怀疑你的对象图中有循环引用,显然不能JSON序列化。因此,您的HTTP请求永远不会发送到服务器,因为客户端不知道如何JSON序列化您的模型。

例如,如果您的UserProfile模型引用了Discussion模型,则可能发生这种情况。因为Discussion模型参考了UserProfile模型,你就有问题了。

要解决这个问题,你应该使用视图模型,而不是在你的Web API中公开你的域模型。