gpt4 book ai didi

c# - HTTPWebRequest & 过了一会儿,400 (Bad Request) 开始

转载 作者:太空狗 更新时间:2023-10-29 20:37:15 26 4
gpt4 key购买 nike

我有一个后台工作线程,它不断地与远程服务器同步数据或从远程服务器同步数据。当我第一次运行该应用程序时,一切似乎都运行良好。它大约每 30 秒发出一次 Web 请求,并成功返回数据。

如果我让模拟器长时间运行,最终请求将失败并返回 (400) Bad Request。所有后续请求都做同样的事情。如果我终止该应用程序并重新启动它……一切都很好。

有人有什么想法吗?代码如下。

public RestResponse<T> Execute<T>(RestRequest request) {
var restResponse = new RestResponse<T>();
var serializer = new JavaScriptSerializer();
var urlPath = baseUrl + "/" + request.Resource;
Console.WriteLine("Requesting: " + urlPath);
var httpRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri(urlPath));

httpRequest.Headers = request.Headers;
foreach (string key in clientHeaders.Keys)
httpRequest.Headers.Add(key, clientHeaders[key]);
httpRequest.Headers.Add("Accept-Encoding", "gzip,deflate");

Authenticator.Authenticate(httpRequest);
httpRequest.Method = request.Method.ToString();
HttpWebResponse httpResponse = null;
try {
if ((request.Method == Method.POST) && (!request.IsJsonPost))
SetPostData(httpRequest, request);

if ((request.Method == Method.POST) && (request.IsJsonPost)){
SetJsonPostData(httpRequest, request);
}

httpResponse = (HttpWebResponse)httpRequest.GetResponse();
var reader = new StreamReader(GetStreamForResponse(httpResponse));
var responseString = reader.ReadToEnd();
Console.WriteLine(responseString);
reader.Close();
restResponse.StatusCode = httpResponse.StatusCode;
restResponse.Headers = httpResponse.Headers;
restResponse.Data = serializer.Deserialize<T>(responseString);
restResponse.ResponseStatus = ResponseStatus.Completed;
httpResponse.Close();
} catch (WebException e) {
restResponse.ResponseStatus = ResponseStatus.Error;
restResponse.ErrorMessage = e.Message;
restResponse.ErrorException = e;
var webResponse = (HttpWebResponse)e.Response;
if (webResponse != null) {
restResponse.StatusCode = webResponse.StatusCode;
restResponse.Headers = webResponse.Headers;
}
if (restResponse.StatusCode != HttpStatusCode.NotModified)
Console.WriteLine("An exception occured:\r\n " + request.Resource + "\r\n" + e + "\r\n");
} catch (Exception ex) {
restResponse.ResponseStatus = ResponseStatus.Error;
restResponse.ErrorMessage = ex.Message;
restResponse.ErrorException = ex;
}

if (httpResponse != null)
httpResponse.Close();

return restResponse;
}

这一行失败了:

httpResponse = (HttpWebResponse)httpRequest.GetResponse();

堆栈跟踪:

System.Net.WebException: The remote server returned an error: (400) Bad Request.
at System.Net.HttpWebRequest.CheckFinalStatus (System.Net.WebAsyncResult result) [0x002f2] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1477
at System.Net.HttpWebRequest.SetResponseData (System.Net.WebConnectionData data) [0x00141] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1300

请求永远不会到达远程服务器。

最佳答案

问题出在 clientHeaders 集合中。此 RESTClient 类在应用程序生命周期中实例化一次。我一遍又一遍地添加标题,而不是先清除它们。过了一会儿, header 变得太大,发出了错误的请求。

关于c# - HTTPWebRequest & 过了一会儿,400 (Bad Request) 开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10941843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com