C# HttpWebRequest.GetRequestStream()超时
我有一个服务,它构建一个HttpWebRequest,并用一个JSON字符串设置其主体,以发送到系统的API。在调用请求流时,我遇到了一个WebException超时错误。为什么它会在这一点上出错?在继续之前是否测试连接到其他系统C# HttpWebRequest.GetRequestStream()超时,c#,timeout,httpwebrequest,system.net.webexception,C#,Timeout,Httpwebrequest,System.net.webexception,我有一个服务,它构建一个HttpWebRequest,并用一个JSON字符串设置其主体,以发送到系统的API。在调用请求流时,我遇到了一个WebException超时错误。为什么它会在这一点上出错?在继续之前是否测试连接到其他系统 try { //Get default request data if (requestObj == null) requestObj = new ApiRequest(); //Convert request info to
try
{
//Get default request data
if (requestObj == null)
requestObj = new ApiRequest();
//Convert request info to json+bytes
string url = _baseUrl + path;
string requestStr = JsonConvert.SerializeObject(requestObj, _jsonSettings);
requestObjJson = requestStr;
byte[] data = Encoding.UTF8.GetBytes(requestStr);
//Post to SystemX
webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.ContentType = "application/json;charset=UTF-8";
webRequest.Headers.Add("access_token", _accessToken);
webRequest.Method = "POST";
webRequest.ContentLength = data.Length;
webRequestJson = JsonConvert.SerializeObject(webRequest, Formatting.Indented);
using (Stream dataStream = webRequest.GetRequestStream())
{
dataStream.Write(data, 0, data.Length);
dataStream.Close();
}
webRequestJson = JsonConvert.SerializeObject(webRequest, Formatting.Indented);
LogMessage("SystemXApiAdapter._request() Request", "Information only. Not an error.", webRequestJson + ";" + requestObjJson, connectionString, customerName, licenseInfoID);
//Get response
string responseString = null;
HttpStatusCode status;
using (HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse())
{
if (response != null)
{
using (Stream stream = response.GetResponseStream())
using (StreamReader sr = new StreamReader(stream))
{
responseString = sr.ReadToEnd();
status = response.StatusCode;
}
response.Close();
}
else
{
status = HttpStatusCode.NoContent;
}
}
T responseObj = null;
LogMessage("SystemXApiAdapter._request() Response", "Information only. Not an error.", responseString, connectionString, customerName, licenseInfoID);
if (typeof(T) == typeof(EmptyApiResponse))
return null;
if (string.IsNullOrEmpty(responseString))
throw new Exception("Empty response for non-empty request");
responseObj = JsonConvert.DeserializeObject<T>(responseString);
if (callback != null)
callback(responseObj);
//Get next page of data if needed
if (handlePaging && status == HttpStatusCode.PartialContent)
{
//Move to next page and recursively make more requests until we've got everything
requestObj.page_num++;
T moreData = _request<T>(path, connectionString, customerName, licenseInfoID, true, requestObj, callback);
if (moreData != null)
responseObj = (T)(responseObj).AppendResponseData(moreData);
}
return responseObj;
}
catch (Exception ex)
{
SystemXApiException SystemXEx = new SystemXApiException(requestObj, ex, webRequestJson);
if (!bIsRetry && SystemXEx.StatusCode.HasValue && retryOnStatuses.Contains(SystemXEx.StatusCode.Value))
{
return _request<T>(path, connectionString, customerName, licenseInfoID, handlePaging, requestObj, callback, true);
}
else
{
throw SystemXEx;
}
if (ex is WebException)
{
WebException webEx = (WebException)ex;
HttpStatusCode? StatusCode = null;
string responseBody = null;
//Read Status Code
if (webEx.Status == WebExceptionStatus.ProtocolError)
{
var response = webEx.Response as HttpWebResponse;
if (response != null)
{
StatusCode = response.StatusCode;
}
}
//Retry once on applicable status code
if (!bIsRetry && StatusCode.HasValue && retryOnStatuses.Contains(StatusCode.Value))
return _request<T>(path, connectionString, customerName, licenseInfoID, handlePaging, requestObj, callback, true);
//Read response Body
if (webEx.Response != null)
{
using (Stream responseStream = webEx.Response.GetResponseStream())
using (StreamReader sr = new StreamReader(responseStream, Encoding.Default))
{
responseBody = sr.ReadToEnd();
}
}
else
{
responseBody = "Empty response body.";
}
string message = null;
//Format new Exception
if (StatusCode.HasValue)
message = string.Format("{0} {1}: {2}: {3}: {4}", (int)StatusCode, StatusCode.ToString(), responseBody, requestObjJson, webRequestJson);
else
message = string.Format("{0} {1}: {2}: {3}: {4}", "No status code", "No status code", responseBody, requestObjJson, webRequestJson);
throw new Exception(message, ex);
}
else
throw;
}
finally
{
if (webRequest != null)
{
webRequest.Abort();
}
}
试试看
{
//获取默认请求数据
if(requestObj==null)
requestObj=新的ApiRequest();
//将请求信息转换为json+字节
字符串url=_baseUrl+路径;
string requestStr=JsonConvert.SerializeObject(requestObj,_jsonSettings);
requestObjJson=requestStr;
byte[]data=Encoding.UTF8.GetBytes(requestStr);
//发送到SystemX
webRequest=(HttpWebRequest)webRequest.Create(url);
webRequest.ContentType=“application/json;charset=UTF-8”;
添加(“访问令牌”,“访问令牌”);
webRequest.Method=“POST”;
webRequest.ContentLength=data.Length;
webRequestJson=JsonConvert.SerializeObject(webRequest,Formatting.Indented);
使用(Stream dataStream=webRequest.GetRequestStream())
{
dataStream.Write(data,0,data.Length);
dataStream.Close();
}
webRequestJson=JsonConvert.SerializeObject(webRequest,Formatting.Indented);
LogMessage(“SystemXapiaAdapter._request()request”,“仅供参考,非错误”,“webRequestJson+”;“+requestObjJson,connectionString,customerName,licenseInfoID”);
//得到回应
字符串responseString=null;
HttpStatusCode状态;
使用(HttpWebResponse=(HttpWebResponse)webRequest.GetResponse())
{
if(响应!=null)
{
使用(Stream=response.GetResponseStream())
使用(StreamReader sr=新StreamReader(stream))
{
responseString=sr.ReadToEnd();
status=response.StatusCode;
}
response.Close();
}
其他的
{
status=HttpStatusCode.NoContent;
}
}
T responseObj=null;
LogMessage(“SystemXapiaAdapter._request()Response”,“仅供参考,非错误”,“responseString”,“connectionString”,“customerName”,“licenseInfoID”);
if(typeof(T)=typeof(EmptyApiResponse))
返回null;
if(string.IsNullOrEmpty(responseString))
抛出新异常(“非空请求的空响应”);
responseObj=JsonConvert.DeserializeObject(responseString);
if(回调!=null)
回调(responseObj);
//如果需要,获取下一页数据
if(handlePaging&&status==HttpStatusCode.PartialContent)
{
//移动到下一页,递归地提出更多请求,直到我们得到所有信息
requestObj.page_num++;
T moreData=_请求(路径、连接字符串、客户名称、licenseInfoID、true、requestObj、回调);
if(moreData!=null)
responseObj=(T)(responseObj).AppendResponseData(moreData);
}
返回响应bj;
}
捕获(例外情况除外)
{
SystemXApiException SystemXEx=新的SystemXApiException(requestObj,ex,webRequestJson);
如果(!bIsRetry&&SystemXEx.StatusCode.HasValue&&retryonstatus.Contains(SystemXEx.StatusCode.Value))
{
返回请求(路径、连接字符串、客户名称、licenseInfoID、handlePaging、requestObj、回调、true);
}
其他的
{
抛出SystemXEx;
}
如果(ex是WebException)
{
WebException webEx=(WebException)ex;
HttpStatusCode?StatusCode=null;
字符串responseBody=null;
//读取状态码
if(webEx.Status==WebExceptionStatus.ProtocolError)
{
var response=webEx.response作为HttpWebResponse;
if(响应!=null)
{
StatusCode=response.StatusCode;
}
}
//在适用的状态代码上重试一次
如果(!bIsRetry&&StatusCode.HasValue&&retryOnStatuses.Contains(StatusCode.Value))
返回请求(路径、连接字符串、客户名称、licenseInfoID、handlePaging、requestObj、回调、true);
//读取响应体
if(webEx.Response!=null)
{
使用(Stream responseStream=webEx.Response.GetResponseStream())
使用(StreamReader sr=newstreamreader(responseStream,Encoding.Default))
{
responseBody=sr.ReadToEnd();
}
}
其他的
{
responseBody=“空响应主体。”;
}
字符串消息=null;
//设置新异常的格式
if(StatusCode.HasValue)
message=string.Format(“{0}{1}:{2}:{3}:{4}”,(int)StatusCode,StatusCode.ToString(),responseBody,requestObjJson,webRequestJson);
其他的
message=string.Format(“{0}{1}:{2}:{3}:{4}”,“无状态码”,“无状态码”,responseBody,requestObjJson,webRequestJson);
抛出新异常(消息,ex);
}
其他的
投掷;
}
最后
{
if(webRequest!=null)
{
webRequest.Abort();
}
}
一个选项是增加时间限制
另一种方法是在超时后重复执行,等待x秒
任何连接都可能出现问题,您的代码需要为此做好准备
我希望它在某种程度上有所帮助
webRequest.Timeout=2000; (2 seconds)