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 ...
随机推荐
- Java 中,Comparator 与 Comparable 有什么不同?
Comparable 接口用于定义对象的自然顺序,而 comparator 通常用于定义用户 定制的顺序.Comparable 总是只有一个,但是可以有多个 comparator 来定义 对象的顺序.
- 机器学习之近邻算法模型(KNN)
1..导引 如何进行电影分类 众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪 个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问 ...
- Vue.js快速介绍-超级马里奥像素艺术
原文出处:Quick Introduction to Vue.js - Super Mario Pixel Art ::代码我已经归纳在github上:[vue2-pixel-art]::::__查看 ...
- 如何利用WebSocket实现网页版聊天室
花了将近一周的时间终于完成了利用WebSocket完成网页版聊天室这个小demo,期间还走过了一段"看似弯曲"的道路,但是我想其实也不算是弯路吧,因为你走过的路必将留下你的足迹.这 ...
- 单例模式的实现Singleton和MonoSingleton
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> / ...
- php运用validate+ajax检测用户名是否已存在
前提:如果还不知道什么是validate,请前往这里 一.remote rules: username:{ required:true, minlength:8, maxlength:8, remot ...
- java中StringBuffer的用法
2.StringBuffer StringBuffer:String类同等的类,它允许字符串改变(原因见上一段所说).Overall, this avoids creating many tempor ...
- 【uniapp 开发】工具类 -- MathUtil
获取随机数 /* ** randomWord 产生任意长度随机字母数字组合 ** randomFlag 是否任意长度 min 任意长度最小位[固定位数] max 任意长度最大位 ** ** 生成6-1 ...
- openlayer路线箭头
// 用于设置线串所在的矢量图层样式的函数 var styleFunction = function(feature,res){ //轨迹线图形 var trackLine= feature.getG ...
- docker容器与虚拟机区别