c#中WebApi開發遇到的坑


一、如何新建一個webApi項目

        打開VS→找到解決方案→新建項目→類庫或web應用程序→選擇空的WebApi項目→在Global.asax文件的Application_Start方法中注冊WebApi的相關配置→完成

二、如何對外提供api接口

       在webApi項目的Controllers文件夾下新增一個類繼承ApiController,在該類中就可以完成對外接口(GET、POST、PUT、DELETE等),需要注意的是如果提供的方法需要參數,則參數的類型不能按它實際的類型聲明和傳遞,如Name不能直接聲明為string類型,否則調用該接口時會報404錯誤,找不到該訪問地址。聲明的方式有很多種:

        (1)創建一個類,該類只包含該方法所需的參數。

        (2)引用FormDataCollection類來聲明和接收參數。

        這是常用的聲明方式,推薦方法(2)。下面用例子的形式說明錯誤寫法和正確寫法

 1         #region 參數聲明示例·錯誤寫法
 2         [Route("Example")]
 3         [HttpPost]
 4         public object Example(string name)
 5         {
 6             var response = new ResponseModel
 7             {
 8                 StatusCode = 200,
 9                 Message = "接收數據成功!",
10                 Data = name
11             };
12             return Json(response);
13         }
14         #endregion

 

 1         #region 參數聲明示例·正確寫法
 2         [Route("Example")]
 3         [HttpPost]
 4         public object Example(FormDataCollection collection)
 5         {
 6             var name = collection.Get("name");
 7             var response = new ResponseModel
 8             {
 9                 StatusCode = 200,
10                 Message = "接收數據成功!",
11                 Data = name
12             };
13             return Json(response);
14         }
15         #endregion
 1         #region 參數聲明示例·正確寫法
 2         [Route("Example")]
 3         [HttpPost]
 4         public object Example(DataInfo data)
 5         {
 6             var response = new ResponseModel
 7             {
 8                 StatusCode = 200,
 9                 Message = "接收數據成功!",
10                 Data = data.Name
11             };
12             return Json(response);
13         }
14         #endregion
15 
16     public class DataInfo
17     {
18         public string Name { get; set; }
19     }

三、自定義票據驗證篩選器

      (1)創建類 AuthorFilter 繼承 AuthorizeAttribute 

 1 using System;
 2 using System.Configuration;
 3 using System.Web;
 4 using System.Web.Http;
 5 using System.Web.Http.Controllers;
 6 using System.Web.Security;
 7 using Xryang.Core.Config;
 8 
 9 namespace Xryang.Api.Author
10 {
11     public class AuthorFilter : AuthorizeAttribute
12     {
13         public override void OnAuthorization(HttpActionContext actionContext)
14         {
15             #region 驗證token → 請求數據
16             var content = actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase;
17             var token = content.Request.Headers["Secret"];
18             if (!string.IsNullOrEmpty(token))
19             {
20                 //驗證token
21                 if (ValidateTicket(token))
22                 {
23                     base.IsAuthorized(actionContext);
24                 }
25                 else
26                 {
27                     HandleUnauthorizedRequest(actionContext);
28                 }
29                 return;
30             }
31             #endregion
32 
33             #region 請求token
34             var appId = content.Request.Headers["AppId"];
35             if (!string.IsNullOrEmpty(appId))
36             {
37                 //驗證AppId
38                 if (IsAllowAppId(appId))
39                 {
40                     base.IsAuthorized(actionContext);
41                 }
42                 else
43                 {
44                     HandleUnauthorizedRequest(actionContext);
45                 }
46                 return;
47             }
48             #endregion
49 
50             #region 非法請求
51             HandleUnauthorizedRequest(actionContext);
52             #endregion
53         }
54 
55         #region 驗證Token
56         //校驗票據(數據庫數據匹配)
57         private bool ValidateTicket(string token)
58         {
59             bool flag = false;
60             try
61             {
62                 //解密Token
63                 var ticket = FormsAuthentication.Decrypt(token).UserData;
64                 if (ticket.Equals("token示例"))
65                     flag = true;
66             }
67             catch (Exception ex)
68             {
69 
70             }
71             return flag;
72         }
73         #endregion
74 
75         #region 驗證AppId
76         private bool IsAllowAppId(string appId)
77         {
78             var config = ConfigurationManager.GetSection("XryangConfig") as XryangConfig;
79             if (string.IsNullOrEmpty(appId) || string.IsNullOrEmpty(config.AppId)) return false;
80             if (appId.Equals(config.AppId)) return true;
81             return false;
82         }
83         #endregion
84     }
85 }

     (2)在api控制器或方法上加上  [AuthorFilter] 即可

 1 using System;
 2 using System.Net.Http.Formatting;
 3 using System.Web.Http;
 4 using System.Web.Security;
 5 using Xryang.Api.Author;
 6 using Xryang.Model.Commons;
 7 
 8 namespace Xryang.Api.Controllers
 9 {
10     [AuthorFilter]
11     [RoutePrefix("Api/App")]
12     public class AppController : ApiController
13     {
14 
15         #region 獲取token
16         [Route("Token")]
17         [HttpPost]
18         public object Token()
19         {
20             var response = new ResponseModel
21             {
22                 StatusCode = 500,
23                 Message = "很抱歉,系統出錯了",
24             };
25             FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(0, "token示例", DateTime.Now,
26                             DateTime.Now.AddHours(1), true,  "token示例",
27                             FormsAuthentication.FormsCookiePath);
28             if (ticket != null)
29             {
30                 var token = FormsAuthentication.Encrypt(ticket);
31                 response.StatusCode = 200;
32                 response.Message = "獲取成功";
33                 response.Data = new { Secret = token };
34             }
35             return Json(response);
36         }
37         #endregion
38 
39         #region 參數聲明示例·正確寫法
40         [Route("Example")]
41         [HttpPost]
42         public object Example(FormDataCollection data)
43         {
44             var response = new ResponseModel
45             {
46                 StatusCode = 200,
47                 Message = "接收數據成功!",
48                 Data = data.Get("Name")
49             };
50             return Json(response);
51         }
52         #endregion
53     }
54 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM