需求:
要用WCF生成 Restful風格的接口,返回 JOSN格式:
{
"AInfo": {
"Code": "1",
"Description": ""
},
"BInfo": {
"Code": "1",
"Description": ""
},
"CInfo": {
"UserGuid": "userguid",
"UserName": "username",
"DanWeiGuid": "danweiguid",
"DanWeiName": "danweiname"
}
}
過程:
1.使用 WCF的 webHttp 綁定。
2.為了增加程序編碼的靈活性,使用了有弱類型特性的 Dictionary<string,object>來作為json字符串對應的類。
new Dictionary<string,object>
{
{"AInfo", new Dictionary<string,string>
{
{"Code","1"},
{"Description",""}
}
},
{"BInfo", new Dictionary<string,string>
{
{"Code","1"},
{"Description",""}
}
},
{"CInfo", new Dictionary<string,string>
{
{"UserGuid","UserGuid"},
{"UserName","UserName"},
{"DanWeiGuid","DanWeiGuid"},
{"DanWeiName","DanWeiName"}
}
}
}
3.WCF 默認的序列化不支持 Dictionary 。
4.修改WCF 傳入參數與返回參數的格式。支持 string 傳入,string返回。
具體實現:
webconfig 配置,增加extensions,指向修改後的 JsonBehaviorExtension
<extensions>
<behaviorExtensions>
<add name="JsonBehavior" type="JsonBehavior.Json.JsonBehaviorExtension,JsonBehavior"/>
</behaviorExtensions>
</extensions>
public class JsonBehaviorExtension : BehaviorExtensionElement
{
public override Type BehaviorType
{
get { return typeof(JsonBehavior); }
}
protected override object CreateBehavior()
{
return new JsonBehavior();
}
}
這是我們選擇序列化工具的一個入口。接下來可以使用我們自己寫的 JsonBehavior。 public class JsonBehavior : WebHttpBehavior{}
在這裡我們要重寫 GetRequestDispatchFormatter,GetReplyDispatchFormatter。轉到自己的 JsonDispatchFormatter, 在這個類裡面就有了我們需要DeserializeRequest,和 SerializeReply。我們增加一個邏輯,如果是 typeof(string) 那就不作處理。
傳入參數 if (operation.Messages[0].Body.Parts[0].Type == typeof(string))
{
parameters[0] = Encoding.UTF8.GetString(rawBody);
}
返回參數 if (operation.Messages[1].Body.ReturnValue.Type == typeof(string))
{
body = Encoding.UTF8.GetBytes((string)result);
}
這樣就可以了。 input string → output string 。 序列化的過程開放出來了,可以選擇適合自己的序列化工具了。
完整代碼: https://github.com/qianch/JsonWCF
來源:http://www.cnblogs.com/EllisQian/p/6358288.html