zoukankan      html  css  js  c++  java
  • 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 }

    有经得起考验的,稳定的系统代码,干啥都会更顺利一些,更快一些,开展工作也会更顺一些。遇到的挫折也会少一些。

  • 相关阅读:
    5 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之生产环境下drbd裂脑处理
    elk系列8之logstash+redis+es的架构来收集apache的日志
    elk系列7之通过grok分析apache日志
    elk系列6之tcp模块的使用
    elk系列5之syslog的模块使用
    elk系列4之kibana图形化操作
    elk系列3之通过json格式采集Nginx日志
    elk系列2之multiline模块的使用
    Docker探索系列2之镜像打包与DockerFile
    elk系列1之入门安装与基本操作
  • 原文地址:https://www.cnblogs.com/jirigala/p/5076491.html
Copyright © 2011-2022 走看看