【Azure APIM】列举几种在APIM 策略中的主动生产的错误语句

azure,apim,列举,几种,策略,主动,生产,错误,语句 · 浏览次数 : 12

小编点评

**第一种错误:使用 return-response 返回指定错误码return-response 策略会取消执行,为调用方返回默认响应或自定义响应。默认响应为200 OK,无正文。可以通过上下文变量或策略语句指定自定义响应。** ```json <policies> <inbound> <base /> <return-response> <set-status code="505" reason="error0" /> <set-header name="WWW-Authenticate" exists-action="override"> <value>Bearer error=\"invalid_token\"</value> </set-header> </return-response> &;/inbound> <backend> <base /> </backend> <outbound> <base /> <return-response> <set-status code="505" reason="error0" /> <set-header name="WWW-Authenticate" exists-action="override"> <value>Bearer error=\"invalid_token\"</value> </set-header> </return-response> &;/outbound> <on-error> <base /> <;/on-error></policies> ``` **第二种错误:定义变量,直接抛出异常** ```json <policies> <inbound> <base /> <set-variable name="Error" value=\"@{ throw new Exception(\"test one time error here:ERR_001\"+DateTime.UtcNow.ToString(\"O\")); }\" /> <base /> &;/inbound> <backend> <base /> <set-variable name="Error" value=\"@{ throw new Exception(\"test n time error here :ERR_002 or n in retry policy\"+DateTime.UtcNow.ToString(\"O\")); }\" /> </set-variable> &;/backend> <outbound> <base /> <set-variable name="Error" value="@{ throw new Exception(\"forward-request (32.859 ms){\"messages\": [\"Error occured while calling backend service.\",\"The remote name could not be resolved: 'www.ted1111.com'\"}}" /> &;/outbound> <on-error> <base /> <retry condition=\"@(505>= 500)\" count="3" interval="1" first-fast-retry="true"> <set-variable name="Error" value="@{ throw new Exception(\"test n time error here :ERR_002 or n in retry policy\"+DateTime.UtcNow.ToString(\"O")); }" /> </retry> &;/on-error></policies> ``` **第三种错误:设置错误域名,制造DNS解析错误使用 set-backend-service 策略将传入请求重定向到一个后端,此后端不同于在 API 设置中为该操作指定的后端。** ```json <policies> <inbound> <base /> <set-variable name="Error" value="@{ throw new Exception(\"forward-request (32.859 ms){\"messages\": [\"Error occured while calling backend service.\",\"The remote name could not be resolved: 'www.ted1111.com'\"}}" /> &;/inbound> <backend> <base /> <set-variable name="Error" value="@{ throw new Exception(\"forward-request (32.859 ms){\"messages\": [\"Error occured while calling backend service.\",\"The remote name could not be resolved: 'www.ted1111.com'\"}}" /> </set-variable> &;/backend> <outbound> <base /> <return-response> <set-status code="500" reason="error0" /> <set-header name="WWW-Authenticate" exists-action="override"> <value>Bearer error=\"invalid_token\"</value> </set-header> </return-response> &;/outbound> <on-error> <base /> <;/on-error></policies> ```

正文

问题描述

在为APIM服务配置了诊断日志(Diagnostic Setting),把日志收集在Log A Workspace中,需要验证日志中是否能查看到请求的错误信息。

所以想人为的来制造一些错误。经过网络搜索,参考Policy的文档介绍后,完成了以下3种错误

 

第一种:使用 return-response 返回指定错误码

return-response 策略会取消执行,为调用方返回默认响应或自定义响应。

默认响应为200 OK,无正文。

可以通过上下文变量或策略语句指定自定义响应。 二者都提供时,会通过策略语句对上下文变量中包含的响应进行修改,然后再将其返回给调用方。

如下的示例:自定义返回505错误,并且设置错误消息为 Bearer error="invalid_token"。

<policies>
    <inbound>
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
        <return-response>
            <set-status code="505" reason="error0" />
            <set-header name="WWW-Authenticate" exists-action="override">
                <value>Bearer error="invalid_token"</value>
            </set-header>
        </return-response>
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

效果展示:

 

 

第二种: 定义变量,直接抛出异常 @{ throw new Exception( ... ); }

set-variable 策略声明set-variable变量,并为其分配通过表达式或字符串文本指定的值。在赋值语句种直接抛出异常

并使用重试(retry)策略,让错误多次出现。使得诊断日志种生成的日志Errors中保存请求中产生的全部错误

<policies>
    <inbound>
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <set-variable name="Error" value="@{ throw new Exception("test one time error here:ERR_001"+DateTime.UtcNow.ToString("O")); }" />
        <base />
    </outbound>
    <on-error>
        <base />
        <retry condition="@(505>= 500)" count="3" interval="1" first-fast-retry="true">
            <set-variable name="Error" value="@{ throw new Exception("test n time error here :ERR_002 or n in retry policy"+DateTime.UtcNow.ToString("O")); }" />
        </retry>
    </on-error>
</policies>

效果展示:

 

第三种:set-backend-service,设置错误域名,制造DNS解析错误

使用 set-backend-service 策略将传入请求重定向到一个后端,此后端不同于在 API 设置中为该操作指定的后端。比如:https://www.ted1111.com/

<policies>
    <inbound>
        <base />
        <set-backend-service base-url="https://www.ted1111.com/" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

效果展示:

实际错误:

forward-request (32.859 ms)
{
    "messages": [
        "Error occured while calling backend service.",
        "The remote name could not be resolved: 'www.ted1111.com'"
    ]
}

 

汇总

在Log A Workspace中, 查看日志表 ApiManagementGatewayLogs 中所收集的这三种错误日志:

第一种错误:并没有Errors被记录,只有错误的状态码返回。

第二种错误:状态码为500。但是,在Errors包含了请求中生产的全部日志,非常有利于Debug。

第三种错误:状态码为500。同时,在Errors中,也包含了请求中的详细错误。

 

参考资料

API 管理策略参考 : https://docs.azure.cn/zh-cn/api-management/api-management-policies

 
 

 

与【Azure APIM】列举几种在APIM 策略中的主动生产的错误语句相似的内容:

【Azure APIM】列举几种在APIM 策略中的主动生产的错误语句

问题描述 在为APIM服务配置了诊断日志(Diagnostic Setting),把日志收集在Log A Workspace中,需要验证日志中是否能查看到请求的错误信息。 所以想人为的来制造一些错误。经过网络搜索,参考Policy的文档介绍后,完成了以下3种错误 第一种:使用 return-resp

【Azure APIM】APIM self-host 部署在K8S中,如何更换证书呢?

问题描述 APIM self-host(自建网关)部署在K8S中,如何在本地上传及更换证书呢? 问题解答 如果使用Self-host网关,则不支持使用上传到 APIM的 CA 根证书验证服务器和客户端证书。 若要建立信任,请配置特定的客户端证书,使其被网关作为一个自定义的证书颁发机构所信任,使用网关

【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败

问题描述 使用微软API管理服务(Azure API Management),简称APIM。 因为公司策略要求只能内部网络访问,所以启用了VNET集成。集成方式见: (在内部模式下使用 Azure API 管理连接到虚拟网络:https://docs.azure.cn/zh-cn/api-manag

【Azure API 管理】APIM中证书更新问题

问题描述 每一年到期更新域名证书,APIM会中断服务,请问如何不中断服务? 问题解答 Azure API 管理允许在受信任的根证书和中间证书存储中的计算机上安装 CA 证书,分配证书的过程可能需要 15 分钟或更久,这取决于部署规模。 开发人员 SKU 在此过程中有停机时间。 基本 SKU 和更高级

【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

问题描述 使用Azure API Management, 想对一些固定的IP地址进行访问次数的限制,如被限制的IP地址一分钟可以访问10次,而不被限制的IP地址则可以无限访问? ChatGPT 解答 最近ChatGPT爆火,所以也把这个问题让ChatGPT来解答,然后人工验证它的回答正确与否? 根据

【Azure API Management】实现在API Management服务中使用MI(管理标识 Managed Identity)访问启用防火墙的Storage Account

问题描述 在Azure的同一数据中心,API Management访问启用了防火墙的Storage Account,并且把APIM的公网IP地址设置在白名单。但访问依旧是403 原因是: 存储帐户部署在同一区域中的服务使用专用的 Azure IP 地址进行通信。 因此,不能基于特定的 Azure 服

Azure Function 时区设置

一,引言 Azure Function 上的默认使用UTC 运行程序,我们在获取时间,或者通过时间执行某些逻辑时,返回UTC 时间,导致业务数据不正常,由于 Azure Function 是微软提供的 IaaS 托管服务,我们无法登录服务器来修改时区,那么我们今天将来实践操作,如何通过配置达到更改

【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)

介绍一个简单的工具,用于将Redis数据从一个redis端点复制到另一个redis端点,基于原始存储库转换为.NET 8:https://github.com/LuBu0505/redis-copy-net8

【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)

在前一篇文章中,我们是把.NET 8应用读取SSL证书(X509)示例部署在App Service Windows环境中,那么如果部署在Linux环境,以及Linux Container中呢? 根据前文中的第一种方法,直接在把证书文件包含在源文件中,通过相对路径读取证书文件的方式,经测试,可以正常工

【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)

在使用App Service服务部署业务应用,因为有些第三方的接口需要调用者携带TLS/SSL证书(X509 Certificate),在官方文档中介绍了两种方式在代码中使用证书: 1) 直接使用证书文件路径加载证书 new X509Certificate2 2) 从系统的证书库中通过指纹加载...