2016-09-19 4 views
0

Also ich versuche diese HttpResponseMessage und es funktioniert gut, solange ich nichts in die Content-Eigenschaft. Aber ich brauche es jetzt irgendwie, um einen JSON im Inhalt der Nachricht zurückzugeben.Die HttpResponseMessage funktioniert nicht, wenn die Content-Property gefüllt ist

Mein Code sieht wie folgt aus:

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; 
    } 
} 

Die Schnittstelle

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

Und schließlich die Klasse

[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; } 
} 

Jede Hilfe

würde geschätzt
+0

Auch versucht, einen Nachrichtentyp zurückgeben und ich bekomme immer noch eine "Konnte keine Antwort bekommen" – user3404416

Antwort

0

mir dauerte eine Weile aber Ich habe es herausgefunden.

Der Grund, warum es nicht funktionierte, ist, weil HttpContent in HttpResponseMessage abstrakt ist (es erklärt auch, warum die Message-Klasse auch nicht gut funktionierte). Der automatische Konverter von WCF mit DataContractAttribute weiß nicht, was mit der abstrakten Klasse zu tun ist. Ich habe 2 Abhilfe für dieses Problem gefunden.

1.Verwenden JsonConvert von Newtonsoft den Nachrichtentyp als Rückkehr zu halten

  • serialisiert das Objekt (Message oder HttpResponseMessage)
  • Verwendung UTF8Encoding.GetByte (yourjsonSerialized)
  • New Memory mit Byte-Array
  • CreateStreamResponse (Memory, "application/json") in WebOperationContext

2. Benutzerdefinierte Klasse, die Ihr Objekt enthält, indem benutzerdefinierte Interfaces (oder abstrakte Klasse) und das KnowType-Attribut verwendet werden. Oder indem Sie die Schnittstelle/abstrakte Klasse von Message und HttpResponseMessage verwenden.

Die sauberere Art, es zu tun, aber es ist das längste.

Verwandte Themen