C#.NET 大型企業信息化系統集成快速開發平臺 4.2 版本 - 外部服務調用、內部服務調用優化,面向服務化的

 

如今的信息系統愈來愈複雜,愈來愈龐大,不只須要內部是一個總體,並且還須要提供不少對外的服務調用。數據庫

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 }

 

有經得起考驗的,穩定的系統代碼,幹啥都會更順利一些,更快一些,開展工做也會更順一些。遇到的挫折也會少一些。服務器

相關文章
相關標籤/搜索