2017-12-20 12 views
0

私の認証サービスからの応答を使用して、リクエストのクエリパラメータを追加したいと思います。これらは一例です:私はこのエラーを取得していますAzure APIゲートウェイポリシー

<policies> 
    <inbound> 
    <!-- Extract Token from Authorization header parameter --> 
    <set-variable name="token" value="@(context.Request.Headers.GetValueOrDefault("Authorization","JWT").Split(' ').Last())" /> 

    <!-- Send request to Token Server to validate token (see RFC 7662) --> 
    <send-request mode="new" response-variable-name="tokenstate" timeout="20" ignore-error="false"> 
    <set-url>AUTH Service</set-url> 
    <set-method>POST</set-method> 
    <set-header name="Content-Type" exists-action="override"> 
     <value>application/x-www-form-urlencoded</value> 
    </set-header> 
    <set-body>@($"token={(string)context.Variables["token"]}")</set-body> 
    </send-request> 

    <choose> 
    <when condition="@((bool)((IResponse)context.Variables["tokenstate"]).Body.As<JObject>()["active"] == false)"> 
     <return-response response-variable-name="existing response variable"> 
     <set-status code="401" reason="Unauthorized" /> 
     </return-response> 

    </when> 
    <otherwise> 
     <set-query-parameter name="domain_id" exists-action="append"> 
      <value> 
      @((string)((IResponse)context.Variables["tokenstate"]).Body.As<JObject>()["content"]["domain_id"]) 
      </value> 
     </set-query-parameter> 
    </otherwise> 
    </choose> 

    <base /> 

</inbound> 
</policies> 

しかし:

{ 
    "messages": [ 
     { 
      "message": "Expression evaluation failed.", 
      "expression": "(string)((IResponse)context.Variables[\"tokenstate\"]).Body.As<JObject>()[\"content\"]", 
      "details": "Object reference not set to an instance of an object." 
     }, 
     "Expression evaluation failed. Object reference not set to an instance of an object.", 
     "Object reference not set to an instance of an object." 
    ] 
} 

任意のアイデア私はそれをどのようにすればよいですか?常にこれを呼び出す際に、メモリに完全なリクエスト/レスポンスボディをキャッシュ避ける私のAUTHサービスからJWTをデコードし、

は、パフォーマンス上の理由のAPIMサービスのためにあなたに

答えて

1

に感謝バックエンドにリクエストに追加して取得することにより、

Body.As()レスポンスは、認証サーバーから直接ストリームされ、同時にJObjectに変換されるため、.Body.Asに対するその2番目の呼び出しの後に消費されます。((IResponse)context.Variables ["tokenstate"]) )はヌル値を生成します。 - この追加のパラメータは、それが後の検査のために保存されるので、メモリ内の応答をキャッシュするサービスを指示し

  1. コール((IResponse)context.Variables["tokenstate"]).Body.As<JObject>(true):次の2つのオプションを持っていることを避けるために

    。後で.As()を呼び出すと、JSONの生のレスポンスをもう一度解析して、同じ作業をやり直してパフォーマンスを向上させます。

  2. またはdo <set-variable name="tokenstate" value="((IResponse)context.Variables["tokenstate"]).Body.As<JObject>()" />。これはtokenstate変数の値を解析されたJSON本体で上書きします。このJSON本体は後でメモリに保存されるので、複数回使用できます。