2017-02-28 2 views
0

Azure API Managementでは、クライアントに返される応答が500の場合、応答の本文をチェックして「Some text」と一致するかどうかを確認します。この特定のシナリオでもっと役に立つテキストを含むように応答の本文を変更できるように、これを行う必要があります。API管理が文字列としてレスポンスボディをキャストできません

私の政策の次<outbound>セクションは、APIの管理コンソールによって受け入れられたが、私はテストして、500を得るとき、API管理でエラーが発生している -

式の評価に失敗しました。型 'Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway.MessageBody'のオブジェクトをキャストできません 'System.String'を入力します。

私はこれが私のせいだと推測していますが、どのようにしてエラーが生成されないように改造を修正することができますか?明確にするために、この行でエラーが生成されています - ((string)(object)context.Response.Body == "Some text")

<outbound> 
    <choose> 
     <when condition="@((context.Response.StatusCode == 500) && ((string)(object)context.Response.Body == "Some text"))"> 
      <set-status code="500" reason="Internal Server Error" /> 
      <set-header name="Content-Type" exists-action="override"> 
       <value>application/json</value> 
      </set-header> 
      <set-body> 
       { 
        "statusCode": "500", 
        "Message": "Some different, more helpful text." 
       } 
      </set-body> 
     </when> 
    </choose> 
</outbound> 

更新

私はcontext.Response.BodyがタイプIMessageBodyであることを発見しました。このタイプについては悲惨な文書がほとんどないようですが、唯一の参考資料はTransformation Policies API管理ドキュメントの<set-body>です。

troubeがある私がしようとすると、私のポリシーを保存するときに、MSが文書化さhavdという例は、例外を生成 -

<set-body> 
@{ 
    JObject inBody = context.Request.Body.As<JObject>(); 
    if (inBody.attribute == <tag>) { 
     inBody[0] = 'm'; 
    } 
    return inBody.ToString(); 
} 
</set-body> 

プロパティまたはインデクサ「string.this [INT]は」に割り当てることはできません - - それは読まれました

+0

元のサンプルには文字列としての読み上げ本文が含まれているため、文字列型は個々の文字の変更をサポートしているためインデクサーが機能します。 JObjectにint indexを持つ書き込み可能なインデクサがない場合 –

答えて

1

を試してください。context.Request.Body.As ()を試してください。方法としては、現在一般的な引数の値として、次の種類をサポートしています。

  • バイト[]
  • 文字列
  • JToken
  • JOBJECT
  • JArray
  • XNode
  • のXElement
  • XDocument

有効なJSONを含まない応答の上で.As <のJObject >を呼び出すと、例外が発生することに注意してください。他のタイプにも同じことが適用されます。

+0

ありがとう、私は未来のことを念頭に置いておきます。 –

関連する問題