2017-06-27 2 views
1

Ich habe diesen Vertrag:Warum ist meine JSON-String-Antwort für eine WCF-Rest-Webdienst-Antwort (schwach typisierte JSON-Antwort) maskiert?

[ServiceContract] 
public interface IServiceJsonContract 
{ 
    [WebInvoke(UriTemplate = "/MyMethod", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST")] 
    Message MyMethod(Message input); 
} 

und die Definition für MyMethod ist:

Message MyMethod(Message input) 
{ 
... 
Message response = Message.CreateMessage(
           MessageVersion.None, 
           "*", 
           "{\"bla\": 2 }", 
           new DataContractJsonSerializer(typeof(string))); 

response.Properties.Add(WebBodyFormatMessageProperty.Name,new 
WebBodyFormatMessageProperty(WebContentFormat.Json)); 

var contextOutgoingResponse = WebOperationContext.Current.OutgoingResponse; 
contextOutgoingResponse.ContentType = "application/json;charset=utf-8"; 

return response; 
} 

beim Aufruf der Methode ich die Json bekam entkommen:

"{\" bla \ ": 2}“

anstelle von unescaped eine (unten):

"{" bla ": 2}"

Irgendeine Idee, wie man den ungesicherten Json ("{" bla ": 2}") bekommt?

Dank

+0

Sie sollten ein Wörterbuch oder ein Objekt übergeben, anstatt Ihren eigenen JSON zu erstellen. – SLaks

+0

Danke, SLaks. Kannst du ein kurzes Beispiel geben? (In meinem Fall habe ich eine Zeichenfolge und DataContractJsonSerializer ist auch String, aber dies entkommt der Antwort – Cezar

Antwort

0

Die DataContractJsonSerializer wird die Zeichenfolge serialisiert und die Anführungszeichen zu entkommen. Erstellen Sie eine Klasse, die Ihre Daten enthält und übergeben Sie diese anstelle der Zeichenfolge.

public class MyData 
{ 
    public string Bla { get; set; } 
} 

// create an instance 
MyData myData = new MyData() 
{ 
    Bla = "the value"; 
}; 

// then use it 
Message response = Message.CreateMessage(
          MessageVersion.None, 
          "*", 
          myData, 
          new DataContractJsonSerializer(typeof(MyData))); 
+0

Danke, aber ich habe schwach-typisierte Json, Dies bedeutet, die JSON-Antwort kann nicht durch Eingabe (mit einer Klasse). Ich habe die Antwort auf eine Zeichenfolge, ich weiß nur nicht, wie man es an den Absender unescaped zurücksenden – Cezar

0

können Sie Stream als output verwenden. Auf diese Weise können Sie unbeschaltete Zeichenketten zurücksenden:

[ServiceContract] 
    public interface IServiceJsonContract 
    { 
     [WebInvoke(UriTemplate = "/MyMethod", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST")] 
     Stream MyMethod(Message input); 
    } 

Stream MyMethod(Message input) 
{ 
.. 
return new MemoryStream(Encoding.UTF8.GetBytes("{\"bla\": 2 }")); 
} 
+0

Ich kenne diese Option, David, und es funktioniert, vielen Dank.Ist, was ich jetzt benutze, aber wann Ich beschwerde mich, dass, wenn ich die Nachricht als ein Parameter habe, ich Nachricht auch als Antwort haben muss (ich habe versucht, den Webdienst mit 2 Endpunkten, json und Seife zu entlarven) 2 Webservices, eine Soap und ein JSON one.Das JSon hat die Definition genau wie deins (aber es wird nett sein, als Nachricht zurückzukehren, um nur einen Webservice zu haben) – Cezar

+0

Sie sind herzlich willkommen, liebe @Cezar, leider können Sie nicht haben beide erholsam und s oap Service wie folgt. – David

+0

Das ist der Fehler, wenn Sie versuchen, die WSDL abzurufen: eine Ausnahme wurde in einem Aufruf an eine WSDL-Export-Erweiterung ausgelöst: DataContractSerializerOperationBehavior Vertrag: http://tempuri.org/:IServiceJsonContract ----> System.InvalidOperationException: The Die Operation 'MyMethod' konnte nicht geladen werden, da sie einen Parameter oder Rückgabetyp vom Typ System.ServiceModel.Channels.Message oder einen Typ mit MessageContractAttribute und anderen Parametern unterschiedlichen Typs aufweist. Wenn Sie System.ServiceModel.Channels.Message oder Typen mit MessageContractAttribute verwenden, darf die Methode keine anderen Arten von Parametern verwenden. – Cezar

Verwandte Themen