【问题标题】:polling with HttpWebRequest使用 HttpWebRequest 进行轮询
【发布时间】:2026-01-06 05:50:01
【问题描述】:

我正在使用this API,它接受图像并将其内容的描述发回。根据文档,cURL 看起来像这样:

 curl -i -X POST \
-H "Authorization: CloudSight [key]" \
-F "image_request[image]=@Image.jpg" \
-F "image_request[locale]=en-US" \
https://api.cloudsightapi.com/image_requests

我发送请求的代码如下:

var request = (HttpWebRequest)WebRequest.Create(cloudsight_url);
request.Method = "POST";
request.Headers.Add("Authorization", "CloudSight R6USrcKxMym0EP2peuYtVA");
string s1 = string.Format("image_request[locale]={0}&image_request[remote_image_url]={1}", "en-US", imgurl);

// Send Data
StreamWriter myWriter = null;
myWriter = new StreamWriter(request.GetRequestStream());
myWriter.Write(s1);
myWriter.Close();
var response1 = (HttpWebResponse)request.GetResponse();
string result2 = "";

using (StreamReader streamReader = new StreamReader(response1.GetResponseStream()))
{
    var output = streamReader.ReadToEnd();
    streamReader.Close();
    result2 = output.ToString();    
}

请求发送成功,但是服务返回{ "status" : "not completed" }。在文档中,它说要继续轮询响应,直到返回 { "status" : "completed" } 响应。我如何实现这一目标?

【问题讨论】:

    标签: c# .net http-post httpwebrequest cloudsight


    【解决方案1】:

    正如您所指出的,文档指出您应该继续轮询,直到响应被标记为已完成。

    您真正需要做的就是将您的 HTTP Web 请求放入一个循环中,该循环一直持续到完成。在一段时间后退出循环而没有成功以避免无限循环可能也是一个好主意。将循环放在单独的线程上也可能是明智的。

    【讨论】:

    • 我会将 http web 请求的哪一部分放入循环中?它不会一遍又一遍地发送相同的请求吗?
    • 根据文档,您可以从/image_requests 获得一个令牌。然后,您将此令牌提供给图像响应的检索。
    • 是的,但令牌不适用于不完整的请求。还是你的意思是说我需要用这个token发送另一个请求等等?
    • 为了进一步澄清,您应该收到一个令牌作为您的/image_requests 调用的结果。然后使用该令牌调用/image_responses/[token]
    • 我收到一个令牌作为响应,但请求状态不完整,使用此令牌不起作用。