Api Management为单向请求设置转发请求

时间:2017-07-05 08:16:42

标签: azure policy azure-api-management

我想登录以记录请求和响应,因此我在入站和出站部分放置了单向请求:

<policies>
    <inbound>                       
        <send-one-way-request mode="new">
            <set-url>@("example.com")</set-url>
            <set-method>POST</set-method>               
            <set-header name="Content-Type" exists-action="override">
                <value>application/json</value>
            </set-header>
            <set-body>@(context.Request.Body.As<string>(preserveContent: true))</set-body>
        </send-one-way-request>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>          
        <send-one-way-request mode="new">
            <set-url>@("example.com")</set-url>
            <set-method>POST</set-method>               
            <set-header name="Content-Type" exists-action="override">
                <value>application/json</value>
            </set-header>
            <set-body>@(context.Response.Body.As<string>(preserveContent: true))</set-body>
        </send-one-way-request>
    </outbound>
</policies>

相同的电话,除了身体。

当我检查跟踪时,我在入站部分看到了这一点:

send-one-way-request(0 ms)

"One way request was successfully send to https://...."

转发请求(9690毫秒)

{
    "response": {
        "status": {
            "code": 200,
            "reason": "OK"
        },
        "headers": [
            {
                "name": "Pragma",
                "value": "no-cache"
            },
            {
                "name": "Content-Length",
                "value": "2"
            },
            {
                "name": "Cache-Control",
                "value": "no-cache"
            },
            {
                "name": "Content-Type",
                "value": "application/json; charset=utf-8"
            },
            {
                "name": "Date",
                "value": "Wed, 05 Jul 2017 07:56:14 GMT"
            },
            {
                "name": "Expires",
                "value": "-1"
            },
            {
                "name": "Server",
                "value": "Microsoft-IIS/8.0"
            },
            {
                "name": "X-AspNet-Version",
                "value": "4.0.30319"
            },
            {
                "name": "X-Powered-By",
                "value": "ASP.NET"
            }
        ]
    }
}

但在出境我只得到:

send-one-way-request(0 ms)

"One way request was successfully send to https://...."

并且没有转发请求。因为我使用单向请求,所以我不希望来自通话的响应,我不记得在入站部分有forward-request(没有在保存中找到它们在入站中使用单向请求跟踪调用。)

是否有其他任何配置会触发转发请求?

修改

我使用azure函数来处理这个问题。当我在子域中输入拼写错误时,转发请求消失了,但是当我在函数名中输入错误时它仍然存在...两个请求都被定向到同一个azure函数。

EDIT2:

这变得更加混乱:当我从swagger文件发送默认正文时,请求转发不在那里。如果我重复请求或者如果我修改默认正文,则会显示...

1 个答案:

答案 0 :(得分:0)

由于send-one-way请求策略在请求处理本身方面是完全异步的,因此无法保证将记录此类请求的回复,因为在收到请求时,请求本身可能会被长时间处理,响应返回客户端以及跟踪信息。所以它最好的工作,如果在收到send-one-way-request的响应时主要请求仍在处理中,则会记录响应,否则不会。

在第一个示例中,记录了对入站单向请求的回复,因为在主请求上仍有很多处理要做 - 向后端发送请求,处理出站段。但是当单向请求被作为出站的最后一个语句放置时,就在发送对客户端的响应之前 - 对单向请求的响应将来得太晚而无法跟踪。

子域中的错字可能会触发更长的连接时间,如果此类域不主动拒绝连接,则会停止响应,因此它将从跟踪中消失。

这都是时间问题。如果您想确保主要请求处理停止,直到您从这些请求获得响应,请使用发送请求策略。