2017-06-27 11 views
1

私はこの契約があります。WCF Rest Webサービス(弱く型付けされたJson)レスポンスに対して、私のJson文字列レスポンスがエスケープされるのはなぜですか?

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

そしてMyMethodはのために定義されています:

"{\" BLA \ ":

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

私はJSONエスケープましメソッドを呼び出す場合: 2}」

エスケープされていないもの(以下):

"{" bla ":2}"

エスケープされていないJson( "{" bla ":2}")の入手方法はありますか?

おかげ

+0

独自のJSONを作成する代わりに、辞書またはオブジェクトを渡す必要があります。 – SLaks

+0

ありがとう、SLaks。私の場合は文字列があり、DataContractJsonSerializerも文字列ですが、これはレスポンスをエスケープします – Cezar

答えて

0

DataContractJsonSerializerは、あなたの文字列をシリアル化し、引用符をエスケープされています。データを保持するクラスを作成し、文字列の代わりに渡します。

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

ありがとうございます。弱い型のJsonを持っています。これは、Jsonレスポンスが(クラスを使用して)型指定できないことを意味します。私は文字列の応答を持っている、私はちょうどエスケープされていない送信者にそれを返信する方法を知らない – Cezar

0

アウトレットとしてStreamを使用できます。この方法で、キャップのない文字列を返すことができます。

[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

私はこのオプションを知っている、David、それは動作します、ありがとう。私はWebサービスをデプロイしました。私はエラーがありました。メッセージをパラメータとして持っていれば、Messageをレスポンスとして持つ必要があります(私は2つのエンドポイント、jsonとsoapを使ってWebサービスを公開しようとしていました) 2つのWebサービス、石鹸とjson one。Jsonはあなたと全く同じ定義を持っています(しかし、最終的に1つのWebサービスしか持たないMessageとして返すのがうれしいです)。 – Cezar

+0

あなたは大丈夫です@Cezar。安心してこのようなoapサービス。 – David

+0

wsdlを取得しようとすると、次のエラーが発生します.WSDLエクスポート拡張機能の呼び出しで例外がスローされました:DataContractSerializerOperationBehavior 契約:http://tempuri.org/:IServiceJsonContract ----> System.InvalidOperationException:操作 'MyMethod'は、System.ServiceModel.Channels.Message型のパラメータまたは戻り値の型、またはMessageContractAttributeおよびその他の型の他のパラメータを持つ型を持つため、ロードできませんでした。 System.ServiceModel.Channels.Messageを使用する場合、またはMessageContractAttributeで型を指定する場合、このメソッドは他のタイプのパラメータを使用してはなりません。 – Cezar

関連する問題