如果不抛出错误请求,如何检查传入 header 的值是否在 Azure APIM 策略中是 Guid

how to check value passed in header is Guid or not in azure APIM policy if not throw bad request

APIM 政策:

<set-variable name="xcid" value="@(context.Request.Headers.GetValueOrDefault("x-correlation-id", Guid.NewGuid().ToString()))" />
        
<choose>
    <!--Request will be rejected if vaild x-correlation-id is not passed -->
    <when condition="@((bool)Guid.TryParse(context.Variables["xcid"], out newGuid)== false)">
        <return-response>
            <set-status code="400" reason="Invalid x-correlation-id is passed please pass valid guid x-correlation-id" />
        </return-response>
    </when>
</choose>

您的解决方案几乎是正确的。

我假设您想实现以下目标。

  • 如果 header x-correlation-id 丢失,创建一个新的 guid 并继续
  • 如果 header x-correlation-id 存在并且值是有效的 guid,则继续
  • 否则,拒绝状态码为 400 的请求

我只需要修复这一行:

 <when condition="@(Guid.TryParse(context.Variables.GetValueOrDefault<string>("xcid"), out Guid newGuid) == false)">

变量 xcid 必须是字符串。 数据类型 Guid 用于输出参数 newGuid。

政策:

    <set-variable name="xcid" value="@(context.Request.Headers.GetValueOrDefault("x-correlation-id", Guid.NewGuid().ToString()))" />
    <choose>
        <!--Request will be rejected if vaild x-correlation-id is not passed -->
        <when condition="@(Guid.TryParse(context.Variables.GetValueOrDefault<string>("xcid"), out Guid newGuid) == false)">
            <return-response>
                <set-status code="400" reason="Invalid x-correlation-id is passed please pass valid guid x-correlation-id" />
            </return-response>
        </when>
    </choose>