代碼: 選擇全部
using System.Collections.Generic;
using System.Web.Mvc;
using CumtomFilter;
using CustomActionResults;
using Models;
public class APIController : Controller
{
public ActionResult GetUser(string name)
{
return new ObjectResult<User>(new User
{
Email = "omaralzabir@gmail.com",
Name = name
});
}
public ActionResult GetUserList()
{
var users = new List<User>();
users.Add(new User { Email = "ScottGu@microsoft.com",
Name = "Scott Gurthie",
ElectronicAddrs = new List<ElectronicAddr>()
{
new ElectronicAddr() { City = "TW", Addr = "MyAddr"}
}
});
users.Add(new User { Email = "OmarALZabir@gmail.com", Name = "Omar AL Zabir" });
return new ObjectResult<List<User>>(users);
}
[HttpPost]
[ObjectFilter(Param = "users", RootType = typeof(User[]))]
public ActionResult UploadUser(User[] users)
{
return new ObjectResult<User[]>(users);
}
代碼: 選擇全部
using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Web.Mvc;
using System.Xml.Linq;
using System.Xml.Serialization;
public class ObjectFilter : ActionFilterAttribute
{
public string Param { get; set; }
public Type RootType { get; set; }
#region IActionFilter Members
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if ((filterContext.HttpContext.Request.ContentType ?? string.Empty)
.Contains("application/json"))
{
object o = new DataContractJsonSerializer(RootType)
.ReadObject(filterContext.HttpContext.Request.InputStream);
filterContext.ActionParameters[Param] = o;
}
else
{
var xmlRoot = XElement.Load(new StreamReader(
filterContext.HttpContext.Request.InputStream,
filterContext.HttpContext.Request.ContentEncoding));
object o = new XmlSerializer(RootType)
.Deserialize(xmlRoot.CreateReader());
filterContext.ActionParameters[Param] = o;
}
}
#endregion
}
Client:
代碼: 選擇全部
private void PostToServiceExample()
{
string targetUrl = "http://localhost:2581/API.mvc/GetUserList";
string ResultString = string.Empty;
//// 取得Json
ResultString = PostUrl(targetUrl, string.Empty, ContentTypeKnd.Json);
User[] JsonList = User.JsonToObject(ResultString);
//// 取得XML
ResultString = PostUrl(targetUrl, string.Empty, ContentTypeKnd.Xml);
User[] XmlList = User.XmlToObject(ResultString);
//// 初始化新增的資料
User[] users = new[]
{
new User()
{
Email = "Rusli1@mail.gss.com.tw", Name = "Rusli1"
},
new User()
{
Email = "Rusli2@mail.gss.com.tw",
Name = "Rusli2",
ElectronicAddrs = new List<ElectronicAddr>()
{
new ElectronicAddr()
{
City = "MyCity0",
Addr = "MyAddr0"
},
new ElectronicAddr()
{
City = "MyCity1",
Addr = "MyAddr1"
},
}
},
};
//// User[] 物件陣列 轉換 Json
string postInfo = User.ObjectToJson(users);
//// 送出的API
targetUrl = "http://localhost:2581/API.mvc/UploadUser";
//// 送出 POST Json 資料 取得回傳 Json
ResultString = PostUrl(targetUrl, postInfo, ContentTypeKnd.Json);
////回傳回來 Json 轉換成 物件
User[] UploadUserJsonList = User.JsonToObject(ResultString);
}
private string PostUrl(string targetUrl, string postInfo, ContentTypeKnd contentTypeKnd)
{
string responseInfo = string.Empty;
try
{
WebRequest request = WebRequest.Create(targetUrl);
request.ContentType = contentTypeKnd == ContentTypeKnd.Xml
? "application/x-www-form-urlencoded"
: "application/json";
request.Method = "POST";
byte[] bts = System.Text.Encoding.UTF8.GetBytes(postInfo);
request.ContentLength = bts.Length;
using (Stream st = request.GetRequestStream())
{
st.Write(bts, 0, bts.Length);
st.Close();
}
WebResponse response = request.GetResponse();
if (response == null)
{
throw new Exception("Request 回傳null,請確認網路狀態或是Server是否正常");
}
StreamReader sr = new StreamReader(response.GetResponseStream());
responseInfo = sr.ReadToEnd().Trim();
}
catch (Exception ex)
{
throw ex;
}
return responseInfo;
}
代碼: 選擇全部
public enum ContentTypeKnd : byte
{
Xml = 1,
Json = 2
}
public enum ContentTypeKnd : byte
{
Xml = 1,
Json = 2
}
代碼: 選擇全部
using System;
using System.Runtime.Serialization;
[Serializable]
[DataContract]
public class ElectronicAddr
{
[DataMember]
public string City { get; set; }
[DataMember]
public string Addr { get; set; }
}
代碼: 選擇全部
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
[Serializable]
[DataContract]
public class User
{
[DataMember]
public string Email { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public List<ElectronicAddr> ElectronicAddrs { get; set; }
public static string ObjectToJson<T>(T[] t)
{
string result;
//Create a stream to serialize the object to.
using (var ms = new MemoryStream())
{
// Serializer the User object to the stream.
var ser = new DataContractJsonSerializer(typeof(T[]));
ser.WriteObject(ms, t);
result = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
}
return result;
}
public static string ObjectToXML<T>(T[] t)
{
string result = string.Empty;
//// Set the public property values.
using (MemoryStream stream = new MemoryStream(500))
{
using (var xmlWriter = XmlTextWriter.Create(stream,
new XmlWriterSettings()
{
OmitXmlDeclaration = true,
Encoding = Encoding.UTF8,
Indent = true
}))
{
XmlSerializer serializer = new XmlSerializer(typeof(T[]));
//// Serialize the object, and close the TextWriter.
serializer.Serialize(xmlWriter, t);
}
result = Encoding.UTF8.GetString(stream.ToArray());
}
return result;
}
public static T[] JsonToObject<T>(string json)
{
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
return new DataContractJsonSerializer(typeof(T[])).ReadObject(ms) as T[];
}
public static T[] XmlToObject<T>(string xmlString)
{
var xmlRoot = XElement.Parse(xmlString);
return new XmlSerializer(typeof(T[])).Deserialize(xmlRoot.CreateReader()) as T[];
}
}