0

2 つの異なるコントラクト シリアライザーを使用して 2 つの異なるエンドポイントを持つことが可能かどうかを知っている人はいますか? 特に、SOAP/XML のデフォルトの DataContractSerializer と REST/JSON の Json.NET シリアライザー

目的 (互換性の問題による) は、同じDTO クラスのPerson を以下のJSONおよびXML形式にシリアル化することです。

DTO クラス:

public class Person
{
    public string Name { get; set; }
    public string Surname { get; set; }
}

JSON

{Psn:{"Nm":"name1","Snm":"surname1"}}

XML

<Person><Name>name1</Name><Surname>surname1</Surname></Person>

ご覧のとおり、JSON の応答には短縮されたプロパティ名が含まれている必要がありますが、XML バージョンの完全なプロパティ名が含まれている必要があります。

私の考えでは、DataContractSerialiser によって理解されるものと Json.Net シリアライザーによって理解されるもの、つまり次のようなものです。

[DataMember]
[JsonObject(Title="Psn")]
public class Person
{
    [DataMember]
    [JsonProperty(PropertyName="Nm")]
    public string Name { get; set; }

    [DataMember]
    [JsonProperty(PropertyName="Snm")]
    public string Surname { get; set; }
}

これをどのように達成できるかについての考えをいただければ幸いです。

4

2 に答える 2

0

1 つの解決策は、同じ構造を持つ 3 つの人物クラスを持つことです。

[DataMember]
public class Person_dm

[JsonObject(Title="Psn")]
public class Person_json

public class Person

内部で Person クラスを使用し、それぞれの契約/エンドポイントで Person_dm と Person_json を使用します。タイプ間でマッピングする必要がありますが、これは Automapper で行うことができます。

于 2012-12-04T21:50:20.207 に答える
0

これが最終的に実装された方法は、WCF Raw メソッドを使用することでした。http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx

質問に記載されているのと同じ DTO を維持して、2 つの運用契約が作成されます。

1 つは SOAP/XML 用GetPersonResponse GetPerson(GetPersonRequest request)で、もう 1 つは REST/JSON 用System.IO.Stream GetPerson_Rest(params...)です。

必要に応じて実装GetPerson()します。次にGetPerson_Rest()、 を呼び出し、その後GetPerson()、返された GetPersonResponse が JSON.Net ライブラリを使用して Json に変換されます。最後に、次のスニペットに示すように、メソッドは Stream オブジェクトを返します。

string jsonResponse = JsonConvert.SerializeObject(response);

// Serialize into stream of bytes
byte[] rawResponse = Encoding.UTF8.GetBytes(jsonResponse);
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";

// Return json raw response
return new MemoryStream(rawResponse);
于 2012-12-21T09:01:36.093 に答える