是否有人知道是否可以使用2个不同的合同序列化器来拥有2个不同的端点?特别是,SOAP / XML的默认DataContractSerializer和REST / JSON的Json.NET序列化器
目标(适当的兼容性问题)是在下面使用相同的 DTO类人员,序列化为以下 JSON 和 XML 格式< / p>
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>
可以看出,Response for JSON应该包含shrunk属性名称,但是包含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; }
}
我很感激有关如何实现这一目标的任何想法。
答案 0 :(得分:0)
一种解决方案是拥有具有相同结构的3人类。
[DataMember]
public class Person_dm
[JsonObject(Title="Psn")]
public class Person_json
public class Person
在内部使用Person类,在各自的合同/端点中使用Person_dm和Person_json。您需要在类型之间进行映射,但这可以使用Automapper完成。
答案 1 :(得分: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()
之后使用JSON.Net库将返回的GetPersonResponse转换为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);