博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 外部服务调用、内部服务调用优化,面向服务化的...
阅读量:4311 次
发布时间:2019-06-06

本文共 5108 字,大约阅读时间需要 17 分钟。

 

现在的信息系统越来越复杂,越来越庞大,不仅需要内部是一个整体,而且还需要提供很多对外的服务调用。

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     ///  16     /// BaseServiceSettingManager 17     /// 服务管理 18     ///  19     /// 修改纪录 20     ///  21     ///        2015.12.25 版本:1.0 JiRiGaLa    主键整理。 22     ///  23     /// 
24 ///
JiRiGaLa
25 ///
2015.12.25
26 ///
27 ///
28 public partial class BaseServiceSettingManager : BaseManager 29 { 30 /// 31 /// 检查一个服务调用是否是允许调用的? 32 /// 1:是否要记录日志? 33 /// 2:是否需要埋点?检查性能?访问频率等?调用次数? 34 /// 3:非合法的调用?是否日志记录? 35 /// 4:异常的要进行处理? 36 /// 37 /// 应用唯一标识 38 /// 应用的签名密钥 39 /// 是否进行限制 40 /// 访问子系统 41 /// 判断的权限编号 42 ///
验证情况
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 }

 

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

转载于:https://www.cnblogs.com/jirigala/p/5076491.html

你可能感兴趣的文章
python--dict和set类型--4
查看>>
快速实现Magento多语言的设置和产品数据的多语言方法
查看>>
python操作数据库
查看>>
Django的ORM基本操作补充一对多
查看>>
A - Oil Deposits(搜索)
查看>>
E - Phone List(字典序,string类型使用)
查看>>
自定义SeekBar三步
查看>>
"Coding Interview Guide" -- 设计一个有getMin功能的栈
查看>>
Java基础知识强化之多线程笔记06:Lock接口 (区别于Synchronized块)
查看>>
PHP笔记09:PHP之 MVC理解
查看>>
Android(java)学习笔记20:UDP协议发送数据
查看>>
stata学习笔记(五):描述性统计分析
查看>>
n!的位数 斯特林公式
查看>>
转:socket
查看>>
hLG2034Fire Maze ---BFS
查看>>
定时Job在IIS中潜在危险-IIS 定期回收
查看>>
Kafka的安装和配置
查看>>
Alpha冲刺(10/10)
查看>>
数组Array的API2
查看>>
为什么 Redis 重启后没有正确恢复之前的内存数据
查看>>