如今的信息系統愈來愈複雜,愈來愈龐大,不只須要內部是一個總體,並且還須要提供不少對外的服務調用。數據庫
1:別人如何調用最方便?用不一樣的開發語言調用、例如app、手持設備、服務器。
2:服務的返回狀態是什麼樣子的?有利於排查問題。
3:服務的安全性、可過渡升級性、性能效率要有保障。
4:服務也須要有完整的調用日誌記錄等。緩存
下面是一個服務調用有效性判斷的函數代碼,供你們參考。安全
1 //----------------------------------------------------------------- 2 // All Rights Reserved , Copyright (C) 2015 , Hairihan TECH, Ltd. 3 //----------------------------------------------------------------- 4 5 using System; 6 using System.Collections.Generic; 7 using System.Data; 8 using ServiceStack.Redis; 9 10 namespace DotNet.Business 11 { 12 using DotNet.Model; 13 using DotNet.Utilities; 14 15 /// <summary> 16 /// BaseServiceSettingManager 17 /// 服務管理 18 /// 19 /// 修改紀錄 20 /// 21 /// 2015.12.25 版本:1.0 JiRiGaLa 主鍵整理。 22 /// 23 /// <author> 24 /// <name>JiRiGaLa</name> 25 /// <date>2015.12.25</date> 26 /// </author> 27 /// </summary> 28 public partial class BaseServiceSettingManager : BaseManager 29 { 30 /// <summary> 31 /// 檢查一個服務調用是不是容許調用的? 32 /// 1:是否要記錄日誌? 33 /// 2:是否須要埋點?檢查性能?訪問頻率等?調用次數? 34 /// 3:非合法的調用?是否日誌記錄? 35 /// 4:異常的要進行處理? 36 /// </summary> 37 /// <param name="appKey">應用惟一標識</param> 38 /// <param name="appSecret">應用的簽名密鑰</param> 39 /// <param name="callLimit">是否進行限制</param> 40 /// <param name="systemCode">訪問子系統</param> 41 /// <param name="permissionCode">判斷的權限編號</param> 42 /// <returns>驗證狀況</returns> 43 public static BaseResult CheckService(string appKey, string appSecret, bool callLimit = false, string systemCode = "Base", string permissionCode = null) 44 { 45 BaseResult result = new DotNet.Utilities.BaseResult(); 46 result.Status = false; 47 48 // AppKey: 23286115 49 // AppSecret: c8d1f06f599d7370467993c72a34c701 50 // permissionCode: "User.Add" 51 52 string ipAddress = Utilities.GetIPAddress(true); 53 54 // 1: 判斷參數是否合理?目標服務,總不能夠爲空,不然怎麼區別誰在調用這個服務了? 55 if (string.IsNullOrEmpty(appKey)) 56 { 57 result.StatusCode = "AccessDeny"; 58 result.StatusMessage = "appKey爲空、訪問被拒絕"; 59 return result; 60 } 61 62 // 2: 判斷是否在接口角色裏, 只有在接口角色裏的,才能夠進行遠程調用,這樣也方便把接口隨時踢出來。 63 string roleCode = "Interface"; 64 if (!BaseUserManager.IsInRoleByCache(systemCode, appKey, roleCode)) 65 { 66 result.StatusCode = "AccessDeny"; 67 result.StatusMessage = "非接口用戶、訪問被拒絕"; 68 return result; 69 } 70 71 // 3: 判斷調用的頻率是否?這裏須要高速判斷,不能總走數據庫?調用的效率要高,不能被遠程接口給拖死了、本身的服務都不正常了。 72 if (callLimit && PooledRedisHelper.CallLimit(appKey, 10, 10000)) 73 { 74 result.StatusCode = "AccessDeny"; 75 result.StatusMessage = "訪問頻率太高、訪問被拒絕"; 76 return result; 77 } 78 79 // 4: 判斷簽名是否有效?是否過時?能夠支持多個簽名,容易升級、容易兼容、容易有個過分的緩衝期。爲了提升安全性,必需要有簽名纔對。 80 if (!BaseServiceSettingManager.CheckServiceByCache(appKey, appSecret)) 81 { 82 result.StatusCode = "AccessDeny"; 83 result.StatusMessage = "不合法簽名、訪問被拒絕"; 84 return result; 85 } 86 87 // 5: 判斷對方的ip是否合法的?1個服務程序,能夠有多個ip。能夠把服務當一個用戶看待,一個目標用戶可能也配置了多個服務,通常是遠程鏈接。 88 BaseUserLogOnManager userLogOnManager = new BaseUserLogOnManager(); 89 BaseUserLogOnEntity userLogOnEntity = userLogOnManager.GetObject(appKey); 90 if (BaseUserManager.CheckIPAddressByCache(userLogOnEntity, ipAddress, true)) 91 { 92 result.StatusCode = "AccessDeny"; 93 result.StatusMessage = "不合法IP、訪問被拒絕"; 94 return result; 95 } 96 97 // 6: 判斷是否有權限?防止被過渡調用,拖死數據庫,能夠用緩存的方式進行判斷,這樣不容易被客戶端、合做夥伴拖垮。 98 if (!string.IsNullOrEmpty(permissionCode) && !BasePermissionManager.IsAuthorizedByCache(systemCode, appKey, permissionCode)) 99 { 100 result.StatusCode = "AccessDeny"; 101 result.StatusMessage = "無權限 " + permissionCode + "、訪問被拒絕"; 102 return result; 103 } 104 105 // 7: 判斷是否有效?判斷時間是否對? 106 BaseUserManager userManager = new BaseUserManager(); 107 BaseUserEntity userEntity = userManager.GetObject(appKey); 108 UserLogOnResult userLogOnResult = userManager.CheckUser(userEntity, userLogOnEntity); 109 if (!string.IsNullOrEmpty(userLogOnResult.StatusCode)) 110 { 111 BaseLoginLogManager.AddLog(systemCode, userEntity, ipAddress, string.Empty, string.Empty, userLogOnResult.StatusMessage); 112 result.StatusCode = userLogOnResult.StatusCode; 113 result.StatusMessage = userLogOnResult.StatusMessage; 114 return result; 115 } 116 117 // 8:目前須要判斷的,都加上了。 118 result.Status = true; 119 return result; 120 } 121 } 122 }
有經得起考驗的,穩定的系統代碼,幹啥都會更順利一些,更快一些,開展工做也會更順一些。遇到的挫折也會少一些。服務器