HttpResponseMessage在填充内容属性时不起作用

时间:2016-09-19 12:59:38

标签: c# asp.net .net rest

所以我试试这个HttpResponseMessage并且它工作正常,只要我不在Content属性中放任何东西。但我现在需要它在消息的内容中返回一个json。

我的代码如下所示:

public HttpResponseMessage GetMemberById()
{
    string id = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["id"];
    List<ClubMember> ls = KCBLL.Instance.FindMemberById(id);
    HttpResponseMessage MessageRetour = new HttpResponseMessage();
    if (ls.Count == 1)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();

        string json = serializer.Serialize(ls.First());
        MessageRetour.Content = new StringContent(json, Encoding.UTF8);
        MessageRetour.StatusCode = HttpStatusCode.OK;
        return MessageRetour;
    }
}

界面

[OperationContract]
[WebInvoke(Method = "GET",ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "GetMemberById")]
HttpResponseMessage GetMemberById();

最后是班级

[DataContract]
public class ClubMember
{
    [DataMember]
    public long MemberId { get; set; }

    [DataMember]
    public string MemberNumber { get; set; }

    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string LastName { get; set; }
}

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

我花了一段时间,但我明白了。

它之所以不起作用,是因为HttpResponseMessage中的HttpContent是抽象的(它也解释了为什么Message类也不能正常工作)。 WCF的DataContractAttribute自动转换器不知道如何处理抽象类。 我找到了解决此问题的2种方法。

1.使用Newtonsoft的JsonConvert将Message类型保留为Return

  • 序列化对象(Message或HttpResponseMessage)
  • 使用UTF8Encoding.GetByte(yourjsonSerialized)
  • 带字节数组的新MemoryStream
  • WebOperationContext中的CreateStreamResponse(MemoryStream,&#34; application / json&#34;)

2.Custom类包含您的对象,使用自定义接口(或抽象类)并使用KnowType属性。或者使用Message和HttpResponseMessage的接口/抽象类。

更干净的方式,但它是最长的。