Google Code Prettify

顯示具有 範例 標籤的文章。 顯示所有文章
顯示具有 範例 標籤的文章。 顯示所有文章

[Web API]手動傳回 JSON 或任何格式的內容

當我們在製作 Web API 系統時,在大部份的情況下我們會需要傳回 JSON 的資料,但通常也是會有圖片或其他各類的電子檔傳回需求,碰到這種情形,我們可以將 Web API 方法的回傳型別宣告為 HttpResponseMessage。 使用 HttpResponseMessage 我們可以傳回 JSON 資料、 圖片影像、文本資料、檔案下載...等都沒問題, 參考以下範例:



/// <summary>  
/// 傳回圖片 
/// </summary> 
[HttpGet]
[Route("api/User/GetImageFile")]
public HttpResponseMessage GetImageFile()
{
 var imgPath = @"D:\00PowerData\Bird.fw.png";
 var imgByte = File.ReadAllBytes(imgPath);
 var imgStream = new MemoryStream(File.ReadAllBytes(imgPath));
 var resp = new HttpResponseMessage(HttpStatusCode.OK) {
  Content = new ByteArrayContent(imgByte)
 };
 resp.Content.Headers.ContentType = new MediaTypeHeaderValue("image/*");
 return resp;
}
/// <summary>  
/// 下載電子檔 
/// </summary> 
[HttpGet] [Route("api/User/GetFile")] public HttpResponseMessage GetFile() { var imgName = "業務填單原始資料.xls"; var imgPath = string.Format(@"C:\Temp\{0}", imgName); var imgByte = File.ReadAllBytes(imgPath); var imgStream = new MemoryStream(File.ReadAllBytes(imgPath)); var resp = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(imgByte) }; resp.Content.Headers.ContentType = new MediaTypeHeaderValue("application/force-download"); resp.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = imgName }; return resp; }
/// <summary>  
/// 傳回 json 資料  
/// </summary>  
[HttpGet]
[Route("api/Test/GetJson")]
public HttpResponseMessage GetJson()
{
 var jsonStr = "{\"IsSuccess\":true,\"Data\":\"www.itdos.com\"}";
 var result = new HttpResponseMessage(HttpStatusCode.OK) {
  Content = new StringContent(jsonStr, Encoding.UTF8, "text/json")
 };
 return result;
}
/// <summary>  
/// 傳回文字資料(含 Html 文字也行)  
/// </summary>  
[HttpGet]
[Route("api/Test/GetHtml")]
public HttpResponseMessage GetHtml()
{
 var str = "返回資料測試<b>返回資料測試</b> <a href='www.google.com'>www.google.com</a>";
 var result = new HttpResponseMessage(HttpStatusCode.OK) {
  Content = new StringContent(str, Encoding.UTF8, "text/plain")
 };
 return result;
}

HTTP content-typ 可以參考 [這裡]
HTTP status code 可以參考 [這裡]
HTTP response header information 可以參考 [這裡]

[C#]JSON資料轉換範例

本範例的資料轉換採用的是 JSON.NET 套件。

Source Code
using System;

using Newtonsoft.Json;

namespace ConsoleApp1
{
    public class TestUser
    {
        public string UserName { get; set; }
        public string UserPassword { get; set; }
        public string UserMail { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            TestUser u = new TestUser {
                UserName = "morse",
                UserPassword = "1234567",
                UserMail = "morsecheng@gmail.com"
            };

            string a = JsonConvert.SerializeObject(u);
            TestUser b = JsonConvert.DeserializeObject(a);
            string c = JsonConvert.SerializeObject(b);

            Console.WriteLine(a);
            Console.WriteLine("------------");
            Console.WriteLine(b);
            Console.WriteLine(b.UserName);
            Console.WriteLine(b.UserMail);
            Console.WriteLine(b.UserPassword);
            Console.WriteLine("------------");
            Console.WriteLine(c);

            Console.WriteLine("Press any key...");
            Console.ReadKey();
        }
    }
}




Result




[MVC]DbContext 資料處理方法的參考範例



D:\0_Rueije\GCP_20180314\GCP201803Web\BT20180402\Models\GCPModelFunction\cls_t_member.cs
using System;
using System.Linq;
using System.Web;

using BT20180402.Models.GCP;
using BT20180402.Models.GCPViewModel;

using clsWebLibrary;

namespace BT20180402.Models.GCPModelFunction {
    public class cls_t_member
    {
        private clsMessage _cMsg = new clsMessage();
        private GCPDbContext _db = new GCPDbContext();
        public t_member_profile GetMemberProfile() {
            t_member_profile ret = new t_member_profile();
            if(HttpContext.Current.Session == null)
                return ret;
            t_member member = (t_member)HttpContext.Current.Session["member_profile"];
            ret = new t_member_profile()
            {
                member_email = member.member_email,
                member_name = member.member_name,
                member_gender = member.member_gender,
                member_birthday = member.member_birthday
            };
            return ret;
        }
        /// ≪summary>
        /// 是否已經登入系統
        /// ≪/summary>
        /// ≪returns>≪/returns>
        public bool IsLogin() {
            bool ret = false;
            if(HttpContext.Current.Session != null)
                ret = HttpContext.Current.Session["member_profile"] != null;
            return ret;
        }
        //TODO:待測
        public bool IsExitsts(string member_id) {
            bool ret = false;
            try
            {
                t_member m = _db.t_member.Where(r => r.member_id == member_id).SingleOrDefault();
                if(m != null)
                    if(member_id != null)
                        ret = true;
            }
            catch(Exception ex)
            {
                _cMsg.TextDataWrite(this.ToString() + Environment.NewLine + ex.ToString());
            }
            return ret;
        }
        /// ≪summary>
        /// 取得會員資料
        /// ≪/summary>
        /// ≪param name="member_email">≪/param>
        /// ≪returns>≪/returns>
        public t_member GetMemberInfoByEmail(string member_email) {
            t_member ret = new t_member();
            try
            {
                ret = _db.t_member.Where(r => r.member_email == member_email).SingleOrDefault();
            }
            catch(Exception ex)
            {
                _cMsg.TextDataWrite(this.ToString() + Environment.NewLine + ex.ToString());
            }
            return ret;
        }
        public t_member GetMemberInfoById(string member_id) {
            t_member ret = new t_member();
            try
            {
                ret = _db.t_member.Where(r => r.member_id == member_id).SingleOrDefault();
            }
            catch(Exception ex)
            {
                _cMsg.TextDataWrite(this.ToString() + Environment.NewLine + ex.ToString());
            }
            return ret;
        }
        /// ≪summary>
        /// 檢查會員信箱及密碼是否存在
        /// ≪/summary>
        /// ≪param name="vm">≪/param>
        /// ≪param name="member">≪/param>
        /// ≪returns>≪/returns>
        public bool MemberLoginCheck(t_member_login vm, ref t_member member) {
            bool ret = false;
            if(!string.IsNullOrEmpty(vm.member_email))
                if(!string.IsNullOrEmpty(vm.member_password))
                {
                    member = GetMemberInfoByEmail(vm.member_email);
                    if(member != null)
                        if(member.is_using == "Y")
                            if((new msEncode()).deCodeByRnd(member.member_password).Equals(vm.member_password))
                            {
                                HttpContext.Current.Session["member_profile"] = member;
                                ret = true;
                            }
                            else
                                _cMsg.TextLogWrite("密碼解密時發生錯誤![" + vm.member_email + "]");
                        else
                            _cMsg.TextLogWrite("帳戶未啟用![" + vm.member_email + "]");
                    else
                        _cMsg.TextLogWrite("沒有找到會員資料!["+vm.member_email+"]");
                }
                else
                    _cMsg.TextLogWrite("未填寫密碼![" + vm.member_email + "]");
            else
                _cMsg.TextLogWrite("未填寫帳號!");
            return ret;
        }
        public bool Insert(t_member_register vm) {
            bool ret = false;
            try
            {
                t_member m = new t_member()
                {
                    member_email = vm.member_email,
                    member_password = (new msEncode()).enCodeByRnd(vm.member_password),
                    create_date = DateTime.Now
                };
                _db.t_member.Add(m);
                _db.SaveChanges();
                ret = true;
            }
            catch(Exception ex)
            {
                _cMsg.TextLogWrite(ex.ToString());
            }
            return ret;
        }
        public bool Update(t_member_profile vm) {
            bool ret = false;
            try
            {
                t_member m = GetMemberInfoByEmail(vm.member_email);
                m.member_email = vm.member_email;
                m.member_name = vm.member_name;
                m.member_gender = vm.member_gender;
                m.member_birthday = vm.member_birthday;
                m.update_date = vm.update_date;
                m.updater = vm.updater;
                _db.Entry(m).State = System.Data.Entity.EntityState.Modified;
                _db.SaveChanges();
                ret = true;
            }
            catch(Exception ex)
            {
                _cMsg.TextLogWrite(ex.ToString());
            }
            return ret;
        }        
        public bool AccountActivation(string member_id) {
            bool ret = false;
            try
            {
                t_member m = GetMemberInfoById(member_id);
                if(m != null)
                {
                    if(m.is_using != "Y")
                    {
                        m.open_date = DateTime.Now;
                        m.is_using = "Y";
                        _db.Entry(m).State = System.Data.Entity.EntityState.Modified;
                        _db.SaveChanges();
                    }
                    ret = true;
                }
            }
            catch(Exception ex)
            {
                _cMsg.TextLogWrite(ex.ToString());
            }
            return ret;
        }
    }
}








[MVC]Code First Example



User
using System;

namespace TokenTest.Models {
    public class User {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Password { get; set; }
        public Guid Salt { get; set; }

        public int RoleId { get; set; }
        public virtual Role Role { get; set; }
    }
}


Role
using System.Collections.Generic;

namespace TokenTest.Models {
    public class Role {
        public int RoleId { get; set; }
        public string Name { get; set; }

        public ICollection User { get; set; }
    }
}


DbContext
using System.Data.Entity;

    namespace TokenTest.Models {
        public class TokenDbContext : DbContext {
            public TokenDbContext()
                : base("name=TokenDbConnection") {
            }

            public virtual DbSet≪User> User { get; set; }
            public virtual DbSet≪Role> Role { get; set; }

            protected override void OnModelCreating(DbModelBuilder modelBuilder) {
            }
        }
    }



因為我在 TokenDbContext 的 base 中,設定 name = TokenDbContext 所以在 web.config 的資料庫連線中要設定:


<configuration>
  <connectionStrings>
    <add name="TokenDbConnection" connectionString="Data Source=localhost;Initial Catalog=MvcTestDb;User ID=xxxxx;Password=xxxxx;Pooling=false;"
      providerName="System.Data.SqlClient"/>
  </connectionStrings>
</configuration>