0

有谁知道是否可以使用 2 个不同的 Contract Serializers 来拥有 2 个不同的端点?特别是 SOAP/XML 的默认 DataContractSerializer 和 REST/JSON 的 Json.NET 序列化程序

目的(由于兼容性问题)是在下面具有相同的DTO 类Person,序列化为以下JSONXML格式

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

一种解决方案是让 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 原始方法。http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx

保持问题中提到的相同 DTO,创建了两个运营合同。

一种用于 SOAP/XML GetPersonResponse GetPerson(GetPersonRequest request),另一种用于 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 回答