C# HttpWebRequest GetRequestStream系统在多次随机调用后出现异常

C# HttpWebRequest GetRequestStream系统在多次随机调用后出现异常,c#,exception,httpwebrequest,getresponsestream,C#,Exception,Httpwebrequest,Getresponsestream,我在C#.NET 3.5 CompactFramework中有一个程序,它从C#Web服务请求数据: public SynchronisationResult<J> Get<J>(IEnumerable<DomainProxy> existingObjects, string controller, string parameters) where J : IdJsonObject) { string existingObjec

我在C#.NET 3.5 CompactFramework中有一个程序,它从C#Web服务请求数据:

    public SynchronisationResult<J> Get<J>(IEnumerable<DomainProxy> existingObjects, string controller, string parameters) where J : IdJsonObject)
{
            string existingObjectsJson = JsonConvert.SerializeObject(existingObjects);
            string url = GenerateUrl(controller, parameters);
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.ContentType = "text/json";
            request.Method = "POST";
            request.KeepAlive = false;
            request.ProtocolVersion = HttpVersion.Version11;
            request.Timeout = 60000;
            request.ContentLength = existingObjectsJson.Length;

            using (Stream requestStream = request.GetRequestStream())
            {
                using (var streamWriter = new StreamWriter(requestStream))
                {
                    streamWriter.Write(existingObjectsJson);
                    streamWriter.Flush();
                    streamWriter.Close();
                }
                requestStream.Close();
            }

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                string responseData = "";
                using (var streamReader = new StreamReader(response.GetResponseStream()))
                {
                    responseData = streamReader.ReadToEnd();
                }
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    result = JsonConvert.DeserializeObject<SynchronisationResult<J>>(responseData);
                }
                else
                {
                    throw new Exception(responseData);
                }
                response.Close();
            }
}
有时会在System.Net.Connection…的Timer.ring中引发SystemException…,但在这种情况下,应用程序不会继续运行,即使不会将异常冒泡到下一个catch块。这意味着,我必须重置设备,它永远不会继续运行

我尝试了以下更改来解决此问题:

  • request.KeepAlive=true/false
  • request.Pipelines=true/false
  • ServicePointManager.DefaultConnectionLimit=1000
  • request.AutomaticDecompression=DecompressionMethods.GZip或无
没什么,例如在Postman中请求可以正常工作。 奇怪的是,如果我在for循环中实现它,要求更新大约200个对象,那么崩溃速度会更快。如果我在一个按钮上实现请求方法,并以大约10秒的频率单击它,那么它的工作时间要长得多。我尝试在端口888上使用开发IIS后端,在端口80上使用生产机器,本地防火墙关闭。没有失败的特定请求,可能是a、B或C类型的请求,。。。每次跑步都不一样

请有人解释一下:

a) 为什么代码被卡住而无法继续

b) 为什么即使抛出异常,代码也会被卡住

c) 如何配置ServicePointManager或请求以使事情正常工作

编辑:这是执行
request.GetRequestStream()
时有时发生的异常:

at System.Threading.Timer.startTimer(UInt32 dueTime)
at System.Threading.Timer.Change(UInt32 dueTime, UInt32 period)
at System.Threading.Timer.Change(Int32 dueTime, Int32 period)
at System.Threading.ThreadPool.QueueUserWorkItem(WaitCallback callBack, Object state, Boolean IsHttpRequest)
at System.Net.Connection.actionSending()
at System.Net.Connection.changeState(ConnectionState state)
at System.Net.Connection.transitionRequestSent(Event e)
at System.Net.Connection.processEvent(Event e)
at System.Net.Connection.actionRequestSent()
at System.Net.Connection.changeState(ConnectionState state)
at System.Net.Connection.transitionIdle(Event e)
at System.Net.Connection.processEvent(Event e)
at System.Net.Connection.submitRequest(HttpWebRequest request)
at System.Net.ServicePoint.SubmitRequest(HttpWebRequest request, String connGroupName)
at System.Net.HttpWebRequest.SubmitRequest()
at System.Net.HttpWebRequest.finishGetRequestStream()
at System.Net.HttpWebRequest.GetRequestStream()

我也被困在这个问题上好几天了。最后我发现,如果我在后台运行Fiddler,则在
请求中不会抛出异常。GetRequestStream()
。这意味着这与fiddler正在处理的连接池有关。因此,我做了一些研究,发现以下链接解决了我的问题:

此外,在请求完成后,请确保您也中止该请求。我所做的是:

if (webrequest != null) webrequest.Abort();

对我来说,现在一切正常。

你能在这里发布解决方案的相关部分吗?如果链接内容更改或消失,此答案将无效
if (webrequest != null) webrequest.Abort();