如果不抛出错误请求,如何检查传入 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>
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>