在 Azure API 管理中,如果基本验证失败则跳过 <backend> 请求

In Azure API Management, skip the <backend> request if basic validation fails

在 Azure API 管理中,如果一些简单的验证失败,是否可以跳过 backend 调用?我需要这样做是因为在这种情况下对后端服务的每次调用都使用了客户端配额的一部分,如果我们知道请求将失败,这是不可取的。

以下面的例子为例,其中 URL 模板是 /MyOperation/{MyParameter}:

这是示例策略 -

<policies>
    <inbound>
        <set-variable name="isValidMyParameter" value="@{
            Match match = Regex.Match(context.Request.MatchedParameters["MyParameter"], "^[0-9]*$");
            return ( match.Value.ToString() != "" ) ? true : false;
        }" />
        <rewrite-uri template="@("/Path/To/Application/" + ""+context.Request.MatchedParameters["MyParameter"])" />
    </inbound>
    <outbound>
        <choose>
            <when condition=""@(!Convert.ToBoolean(context.Variables["isValidMyParameter"]))">
                <set-status code="400" reason="Bad Request" />
                <set-header name="Content-Type" exists-action="override">
                    <value>application/json</value>
                </set-header>
                <set-body>{ "statusCode": 400, "message": "Invalid 'MyParameter'." }</set-body>
            </when>
    </outbound>
</policies>

虽然有效,但即使{MyParameter}无效(假设客户端已通过"asdf"),也会向后端服务发出请求。如上所述,这是不可取的,因为它会占用客户配额。

我考虑过使用<choose>并检查isValidMyParameter的值,但问题是仍然向后端服务发出请求,只是没有重写的URI。这再次占用了客户配额。

是否可以跳过政策的 <backend> 部分并直接返回客户端?

查看 return-响应策略。它将允许您立即停止请求处理和 return 对客户端的响应。

移动选择并在入站正文中添加 return-响应策略。这将导致立即响应客户端跳过后端请求。

<inbound>
    <set-variable name="isValidMyParameter" value="@{
        Match match = Regex.Match(context.Request.MatchedParameters["MyParameter"], "^[0-9]*$");
        return ( match.Value.ToString() != "" ) ? true : false;
    }" />

    <choose>  
        <when condition="@(!Convert.ToBoolean(context.Variables["isValidMyParameter"]))">
            <return-response>  
               <set-status code="400" reason="Bad Request" />
                <set-header name="Content-Type" exists-action="override">
                    <value>application/json</value>
                </set-header>
                <set-body>{ "statusCode": 400, "message": "Invalid 'MyParameter'." }</set-body>
            </return-response>                
        </when>
    </choose> 

    <rewrite-uri template="@("/Path/To/Application/" + ""+context.Request.MatchedParameters["MyParameter"])" />
</inbound>