salesforce零基础学习(一百一十三)Trigger中获取IP地址的过程
本篇参考:
https://help.salesforce.com/s/articleView?language=en_US&type=1&id=000339386
机缘巧合下碰到了这种问题,还挺好玩,记录一下,方便以后再次遇见情况下快速解决。背景如下:
在某个表的创建或者修改的场景下,满足指定条件下会对外部进行一个CALLOUT操作,然后将结果进行相关的更新,接口要求传递当前运行上下文的用户的IP address。demo就先以Case为例。
声明一个trigger,新的表的trigger还好,但是我们可能实际做的是一个二期,维护或者长期的项目,可能有很多handler来执行,这里简单模拟。
trigger CaseTrigger on Case(after insert, after update) {
//DO something, like future callout
CaseHandler.executeCaseHandler();
}
CaseHandler
public with sharing class CaseHandler {
@future
public static void executeCaseHandler() {
String ipAddress;
Map<String, String> session = Auth.SessionManagement.getCurrentSession();
ipAddress = session.get('SourceIp');
System.debug(LoggingLevel.INFO, '*** ipAddress: ' + ipAddress);
}
}
这样写完运行会报错: Current session unavailable,如果运行在future这种异步的,获取session失效,只能运行时是同步的场景才可以,所以我们将代码进行提前。

新的CaseHandler
public with sharing class CaseHandler {
@future
public static void executeCaseHandler(String ipAddress) {
System.debug(LoggingLevel.INFO, '*** ipAddress: ' + ipAddress);
}
}
新的CaseTrigger
trigger CaseTrigger on Case(after insert, after update) {
String ipAddress;
if(!System.isFuture()) {
Map<String, String> session = Auth.SessionManagement.getCurrentSession();
ipAddress = session.get('SourceIp');
}
//DO something, like future callout
CaseHandler.executeCaseHandler(ipAddress);
}
运行一下效果:

本来以为万事大吉了,可以正常使用了,结果case表还可以通过 web-to-case来创建,而本质上就是通过 org id & user id等信息加上case信息来嵌入的创建一个case数据,所以当 web-to-case场景,出现了如下的错误:System.UnexpectedException: Current session unavailable (System Code)
更重要的一点: 此种报错,即使添加 try catch也无法捕获,在code程度,想要handle不可能。

此种问题如果出现了,没有完美的规避方式。workaround solution可以简单参考以下两种:
1. 从业务上来获取数据规律,基于数据规避。我这次好在实际项目中的业务数据具有一定的规律,其他的途径创建的不会有这种类型数据,所以基于业务层面,增加了一些数据层面filter,只有满足情况下才通过 sessionManagement获取。
2. 可以考虑运行文情况。我们之前在salesforce零基础学习(一百零一)如何了解你的代码得运行上下文, web-to-case上下文是 SYNCHRONOUS,我们如果针对这个 callout只是rest场景下或者其他的场景的上下文才会运行,其他的不需要运行,也可以进行规避考虑。
总结:也算是第一次发现基于程序上无法try catch到的场景,但是毕竟也算是小概率事件,所以发现了以后找到相关解决方案即可。本身难度不大,mark一下。篇中有错误地方欢迎指出,有不懂欢迎留言。
salesforce零基础学习(一百一十三)Trigger中获取IP地址的过程的更多相关文章
- 【转】【Salesforce】salesforce 零基础学习(十七)Trigger用法
看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...
- salesforce 零基础学习(十七)Trigger用法
看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...
- salesforce 零基础学习(五十三)多个文件生成一个zip文件(使用git上封装的代码)
此篇参考git代码:https://github.com/pdalcol/Zippex 学习salesforce可以访问一个朋友的网站:https://www.xgeek.net 首先感谢git上提供 ...
- salesforce 零基础学习(二十三)数据记录导出至excel(自定义报表导出)
我们都知道,报表有个功能为导出excel,但是有的时候客户需求往往标准的报表达不到,比如导出excel,其中本月修改的数据字段标红,如下图所示. 这就需要我们去写VF来实现此功能. 需求:将数据表记录 ...
- salesforce零基础学习(七十三)ProcessInstanceWorkItem/ProcessInstanceStep/ProcessInstanceHistory浅谈
对于审批流中,通过apex代码进行审批操作一般都需要获取当前记录对应的ProcessInstanceWorkitem或者ProcessInstanceStep然后执行Approval.process操 ...
- salesforce 零基础学习(三十三)通过REST方式访问外部数据以及JAVA通过rest方式访问salesforce
本篇参考Trail教程: https://developer.salesforce.com/trailhead/force_com_dev_intermediate/apex_integration_ ...
- salesforce零基础学习(九十三)Email To Case的简单实现
Salesforce提供了标准的功能来实现通过Email 创建 Case.我们可以设置指定的路由的地址,指定条件的邮件会自动生成到目标salesforce系统的Case数据.Salesforce提供了 ...
- salesforce 零基础学习(四十三)运算取余
工作中遇到一个简单的小问题,判断两个数是否整除,如果不整除,获取相关的余数. 习惯java的我毫不犹豫的写下了代码 public Boolean isDivisibility(Integer divi ...
- salesforce零基础学习(八十三)analytics:reportChart实现Dashboard(仪表盘)功能效果
项目中经常会用到Report以及Dashboard来分析汇总数据,Dashboard可以指定view as user,如果针对不同的用户需要显示其允许查看的数据,比如 根据role hierarch ...
随机推荐
- 区分构造函数注入和 setter 注入?
构造函数注入 setter 注入 没有部分注入 有部分注入 不会覆盖 setter 属性 会覆盖 setter 属性 任意修改都会创建一个新实例 任意修改不会创建一个新实例 适用于设置很多属性 适用于 ...
- 与和或(&&和||)比较的区别
&&(短路与)和&(逻辑与)的时候: 有假则为假,全真则为真(有假必假,全真为真) ||(短路或)和|(逻辑或)的时候: 有真则为真,全假则为假(有真必真,全假为假)
- 3_一起燃烧卡路里/科学减肥(1)_系统分析实例_数学建模部分_Matlab/Simulink
- 15_伯德图,为什么是20logM?分贝又是什么?_Bode Plot_Part1
- 关于CDN那些事
对于前端性能优化我们不得不了解的几个知识点:CDN.HTTP header信息 今天我就来谈谈我对cdn的理解 1.CDN是什么:CDN全称是Content Delivery Network,即内容分 ...
- HTML中meta标签详解;property=og标签详解
meta是用来在HTML文档中模拟HTTP协议的响应头报文.META标签是HTML语言HEAD区的一个辅助性标签,它位于HTML文档头部的<HEAD>标记和<TITLE>标记之 ...
- 腾讯云+社区开发者大会开启报名,WeGeek 邀你一起聊聊小程序
刚满 2 岁的微信小程序,正给我们带来一种全新轻便的生活方式. 内测时的青涩还历历在目,到现在,小程序生态已日渐成熟.超过 150 万开发者在这里找到了自己的新天地,打磨出超过 100 万个小程序. ...
- c++语法拾遗,一些细节与特性
写了2年多的C+STL的acmer,在学习<C++ primer>时总结的一些少见的语法特性与细节.总体还是和题目说的一样这是一篇 c++ 拾遗. 1 变量和基本类型 1.1 基本类型 1 ...
- 【uniapp 开发】日期工具类 -- DateUtil
日期格式转毫秒值 var time = '2019-08-08 12:09:34'; var time222 = time.replace("-", "/"). ...
- 大数据学习之路之sqoop导入
按照网上的代码导入 hadoop(十九)-Sqoop数据清洗 - 简书 (jianshu.com) ./sqoop import --connect "jdbc:mysql://192.16 ...