David Gard
David Gard

Reputation: 12047

API Managment unable to cast response body as string

In Azure API Management, when the response going back to the client is a 500, I wish to check the body of the response to see if it matches "Some text". I need to do this so that I may change the body of the response to contain some more helpful text in this particular scenario.

The following <outbound> section of my policy is accepted by the API Management console, but when I test and get a 500, API Management generates an error -

Expression evaluation failed. Unable to cast object of type 'Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway.MessageBody' to type 'System.String'.

I'm guessing this is my fault, but does anybody know how I can amend the ploicy so that it does not generate an error? To clarify, the error is being generated by this line - ((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>

Update

I've discovered that context.Response.Body is of type IMessageBody. There seems to be woefully little documentation around this type, and the only reference I can find comes under <set-body> in the Transformation Policies API management documentation.

The troube is, the example that MS havd documented produces an exception when I try and save my policy -

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

Property or indexer 'string.this[int]' cannot be assigned to -- it is read only

Upvotes: 2

Views: 8988

Answers (1)

Vitaliy Kurokhtin
Vitaliy Kurokhtin

Reputation: 7810

Try context.Request.Body.As<string>(). Method As currently supports following types as generic argument value:

  • byte[]
  • string
  • JToken
  • JObject
  • JArray
  • XNode
  • XElement
  • XDocument

Mind that if you try to call .As<JObject> over response that does not contain valid JSON you would get an exception, same applies to other types as well.

Upvotes: 5

Related Questions