.NET 3.5 搭建 REST 的WebApi
启动代码
class Program
{
static void Main(string[] args)
{
WebServiceHost svcHost = new WebServiceHost(typeof(WebApi));
try
{
svcHost.Open();
Console.WriteLine("Service is running");
Console.WriteLine("Press enter to quit...");
Console.ReadLine();
svcHost.Close();
}
catch (CommunicationException cex)
{
Console.WriteLine("An exception occurred: {0}", cex.Message);
svcHost.Abort();
}
}
}
其中WebApi 及接口代码
[ServiceContract]
public interface IWebApi
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/",RequestFormat = WebMessageFormat.Xml,ResponseFormat = WebMessageFormat.Json)]
KT_Response Post(KT_Request request);
}
public class WebApi:IWebApi
{
#region IWebApi 成员
public KT_Response Post(KT_Request request)
{
int i = request.transData.Count;
return new KT_Response();
}
#endregion
}
还有 自定义的请求参数类
[DataContract(Namespace = "http://666.com")]
public class KT_Request
{
[DataMember]
public string orgCode { get; private set; }
[DataMember]
public string orgEntCode { get; private set; }
[DataMember]
public string transNo { get; private set; }
[DataMember]
public Dictionary<string,object> transData { get; set; }
}
这是请求中的 JSON
{
"orgCode": "6666",
"orgEntCode": "9999",
"transNo": "KKKYYY",
"transData": {
"hisAppoNo": "0001835908_7"
}
}
过程说明:
服务启动正常,调用传入参数也是正常的,JSON也转为 KT_Request对象了,但其中的字典没有键值数据,
期望 transData["hisappoNo"]["0001835908_7"] 可以赋值上
如果不是在 REST WEBAPI 的程序中,引用 Newtonsoft.Json.dll ,自己编写代码 将JSON反序列 ,用里面的方法是可以达到 JSON 反序列化成Dictionary的,数据传递转化都是自己写代码控制。
但在这里情况不同,搭建 webapi 是使用 .NET 3.5 中的依赖库 完成 JSON 反序列成 对象的,都是 .NET 完成的,不可控制。(貌似 是 System.Web.Extensions.dll 中 JavaScriptSerializer.Deserialize() 方法实现的,MSDN https://docs.microsoft.com/en-us/dotnet/api/system.web.script.serialization.javascriptserializer.deserialize?view=netframework-3.5)
请帮忙看看 ,在.NET 3.5 ,为了解决这个问题,
或者变通一下,transData 这个属性改成什么类型,
能把 "transData": { "hisAppoNo": "0001835908_7" } 当字符串的保存 进去。我额外再处理。
最懒的方法,前端直接把这个值JSON.stringify()转成string,然后后台以string接受后,JSONConvert.Deserialize转成一个类获得数据
"transData": [
{
"hisAppoNo": "0001835908_7"
}
]
这样试试