应该为批处理作业提供什么HTTP响应代码和标头?

时间:2013-10-14 18:21:32

标签: .net http rest http-headers webclient

我正在使用此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似乎对此响应感到困惑,并发布以下内容:

enter image description here

显然,.NET没有看到上面的HTTP 303,而是通过查看位置URL来报告502,而无法从互联网客户端获取。

问题

  • HTTP响应应该是什么? (我正在轮询状态,应该更改或删除哪些内容?)

  • 如何才能让.NET很好地播放,以便我可以提取代码中嵌入的JSON?

2 个答案:

答案 0 :(得分:2)

我无法说明应该应该是什么(上下文太少),但要处理303响应本身而不是按照您需要的Location URL进行操作失去抽象级别:使用HttpWebRequest并将AllowAutoRedirect设置为false

例如:

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();
    }
}

答案 1 :(得分:0)

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

你根本不应该提供这样的回应。

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

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