首页 > 解决方案 > 为什么“System.Net.WebException:'底层连接已关闭:发送时发生意外错误。” 出现错误?

问题描述

我有一个问题我已经解决了很长时间!我想向 Guesty 服务发送 API 请求(文档链接:https ://docs.guesty.com/#introduction ),并获取 JSON。

string address = "https://api.guesty.com/api/v2/" + path + "?skip=" + sk + "&limit=100"; 
string Storage = "*****" + storage + ".json";

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(address);
webRequest.KeepAlive = false;
webRequest.ProtocolVersion = HttpVersion.Version11;
ServicePointManager.Expect100Continue = false;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls11; // here I tried all sorts of combinations, including  SecurityProtocolType.Tls and SecurityProtocolType.SystemDefault
webRequest.Method = "GET";
webRequest.ContentType = "application/json";
webRequest.ContentLength = 0;
string autorization = extension.GuestyKeyAPI + ":" + extension.GuestySecret; //extension - this is what comes from the form fields
byte[] binaryAuthorization = Encoding.UTF8.GetBytes(autorization);
autorization = Convert.ToBase64String(binaryAuthorization);
autorization = "Basic " + autorization;
webRequest.Headers.Add("Authorization", autorization);
using (WebResponse response = (HttpWebResponse)webRequest.GetResponse()) // This is where the error message appears
{
     using (StreamReader reader = new StreamReader(response.GetResponseStream()))
     {
           using (StreamWriter writer = new StreamWriter(Storage))
           {
                 string s = reader.ReadToEnd();
                 writer.WriteLine(s);
                 reader.Close();
                 writer.Close();
            }
       }
}
string jsonString = File.ReadAllText(Storage);
return jsonString;

但是最讨厌的还不是这个,如果你在VS中点击Continue,然后在表单中重新点击Send,那么突然一切正常,JSON来了。又在另一台电脑上检查,也有同样的情况(所有杀毒程序都被禁用了)。我们也尝试过使用HttpClient,但错误是一样的。我该如何解决这个问题?预先感谢您的任何帮助!

标签: c#asp.net

解决方案


改变这个:

using (StreamReader reader = new StreamReader(response.GetResponseStream()))

对此:

using (StreamReader reader = new StreamReader(response.GetResponseStream(),
    Encoding.UTF8, true, 1024,
    true)) // Leave stream open!

这可以防止using语句处理(关闭)响应流。请参阅StreamReader.cs(258)。我相信您看到的异常源自HttpWebRequest.cs(4321)


推荐阅读