Controller 當Service被忽叫回傳XML or Json

rusli
Site Admin
文章: 212
註冊時間: 週三 7月 07, 2010 9:49 pm

Controller 當Service被忽叫回傳XML or Json

文章rusli » 週四 10月 07, 2010 4:01 pm

Server:

代碼: 選擇全部

    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[];
        }
    }
 

回到「MVC」

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客