2017-10-11 173 views
0

我已经看到其他一些线程但尚未找到解决方案。当从调试模式运行C#Windows From时,我可以使用WebClient从网页读取数据。但是,一旦为应用程序创建可执行文件,我无法从网页读取数据。这里我得到的例外:System.Net.WebException:底层连接已关闭:现有连接被远程主机强制关闭

System.Net.WebException:底层连接已关闭:发送时发生意外错误。 ---> System.IO.IOException:无法从传输连接读取数据:现有连接被远程主机强制关闭。 ---> System.Net.Sockets.SocketException:现有连接被远程主机 强制关闭在System.Net.Sockets.Socket.Receive(Byte []缓冲区,Int32偏移量,Int32大小,SocketFlags socketFlags) 在System.Net.Sockets.NetworkStream.Read(字节[]缓冲液,的Int32偏移的Int32大小)

---内部异常堆栈跟踪的结尾---

下面是代码我的一个片段正在使用:

WebClient webClient = new WebClient(); 
webClient.UseDefaultCredentials = true; 
webClient.Proxy.Credentials = CredentialCache.DefaultCredentials; 
webClient.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"); 
string page = webClient.DownloadString(webPath + manPartNum); 

就像我以前说的,我能够得到这个在调试中正确工作模式的视觉工作室,但只要我创建可执行文件,我不能再从网页上读取。任何帮助,将不胜感激。什么可能导致这个问题?

+0

有几种可能性。 1)由于编译器的依赖性问题,所有更改都没有进入可执行文件。所以你可以删除完全重建项目的bin文件夹,这样发布模式就会重建2)代码第一次运行。但是第二次建立了一个cookie,并且运行有cookie的代码有问题。所以你可以打开一个IE浏览器并删除包括cookie的历史记录,然后重试。或返回到调试版本并查看它是否仍然有效.3)您的旧连接未关闭,并且服务器不允许来自同一IP地址的多个连接。 – jdweng

+1

'UseDefaultCredentials'和您提供的当前用户凭证是否有冲突?当你在调试中“成功”时,我会在输出窗口中查看它,以确保它不会在那里抛出,但让你无论如何都能摆脱它。 – DonBoitnott

+0

感谢您的快速响应。我尝试了你的建议。 1)我删除了bin文件夹并完全重建了该项目。没有成功。 2)我在调试模式下重新运行程序,在调试模式下它仍能正常工作。 3)有没有办法让我关闭webclient? weblient.Close()? –

回答

0

另一种方法是使用一个HttpWebRequest代替:

String responseFromServer = null; 
var url = webPath + manPartNum; 
var request = (HttpWebRequest)HttpWebRequest.Create(urlPing); 
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"; 
var response = (HttpWebResponse)request.GetResponse(); 
if (response.StatusCode == HttpStatusCode.OK) 
{ 
    using (var dataStream = response.GetResponseStream()) 
    { 
     using (var reader = new StreamReader(dataStream)) 
      responseFromServer = reader.ReadToEnd(); 
    } 
} 

if (!String.IsNullOrEmpty(responseFromServer)) 
{ 
} 

除非你是真正的“洛在”页面,您的WebClient使用可能是不必要的。如果你只需要请求页面响应,那么这应该避免所有这些验证头痛。

+0

再次感谢。但是,与WebClient一样,我也遇到了与HttpWebRequest相同的错误。我认为我的问题更多与我尝试访问的网站有关。例如,我可以访问一个分销商网站,但不能访问另一个。该网站似乎认识到我的应用程序是一个机器人。 –

+0

@TylerWilson这可能会限制类似的连接的频率。你看到的间歇模式可能是因为你试图将它们靠得太近,它不喜欢那样。 DDoS预防等。 – DonBoitnott

+0

有什么办法可以避开这种DDoS预防?这显然是有原因的。在我的代码中添加延迟是否允许这样做? –

0

经过更多研究后,我可以确定我尝试访问的网站具有OAuth 2.0身份验证和授权。看起来我必须在公司注册并使用他们的API通过我的应用程序访问他们的网站。希望这可以帮助别人。

相关问题