1

我正在使用此 API 调用轮询给定 REST 批处理作业的状态

GET https://xxx.egnyte.com/pubapi/v1/audit/jobs/1381774131181 HTTP/1.1
Authorization: Bearer 3ysd8zxxxxxxxxxx
Content-Type: application/json
Host: xxx.egnyte.com
Connection: Keep-Alive

HTTP 响应是这样的:

HTTP/1.1 303 See Other
Date: Mon, 14 Oct 2013 18:12:29 GMT
Server: Mashery Proxy
Set-Cookie: EGNYTE-MARKETING-SESSION-COOKIE=1; path=/; domain=egnyte.com
Set-Cookie: X-Egnyte-Subdomain=xxx; path=/; domain=egnyte.com; expires=Tue, 14-Oct-2014 18:12:29 GMT
X-Mashery-Responder: avl-mashery-master
Location: https://haproxy:7180/public-api/v1/audit/logins/1381774131181
Content-Type: application/json;charset=UTF-8
P3P: CP="NOI DSP COR NID CUR TAIa OUR NOR" policyref="/w3c/p3p.xml"
Set-Cookie: EGNYTE-MARKETING-COOKIE=22.22.186.9.138333333885; path=/; expires=Tue, 14-Oct-14 18:12:29 GMT; domain=.egnyte.com
Set-Cookie: JSESSIONID=1333398F4E959E33333F2EA0DB1.avl-app17_6280; Path=/; Secure; HttpOnly
X-Robots-Tag: none
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked

16
{"status":"completed"}
0

.NET 似乎对此响应感到困惑,并发出以下问题:

在此处输入图像描述

显然 .NET 没有看到上面的 HTTP 303,而是通过查看位置 URL 来报告 502,这在 Internet 客户端中不可用。

问题

  • 对此的 HTTP 响应应该是什么?(我正在轮询状态,应该更改或删除什么?)

  • 如何让 .NET 正常运行,以便提取嵌入在代码中的 JSON?

4

2 回答 2

2

我不能说响应应该是什么(上下文太少),但是要处理 303 响应本身而不是遵循LocationURL,您需要失去一个抽象级别:使用 aHttpWebRequest并设置AllowAutoRedirectfalse.

例如:

var request = (HttpWebRequest)WebRequest.Create(url);
request.AllowAutoRedirect = false;

using (WebResponse response = request.GetResponse())
{
    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        var json = reader.ReadToEnd();
    }
}
于 2013-10-14T18:26:48.887 回答
0

我会说你永远不应该303 See Other; Location: private-url为公共客户端提供服务。

您要么根本不提供此类响应。

如果您想在 DC 中使用本地 url,那么您的前端服务器(例如反向代理)应该将响应更改403 Forbidden为例如,因为这就是私有 url 的含义。

其他替代方案是202 Accepted,或者204 No Content因为语义上服务器已接受请求并拒绝泄露响应。

于 2014-06-03T07:47:07.097 回答