日期:2014-05-17  浏览次数:20923 次

求C# Winform下用httpwebrequest进行post访问页面是出现"远程服务器返回错误: (500) 内部服务器错误。"问题解决办法
具体是这样的:制作了一个Winform程序,模拟浏览器登录,之后再进行一系列的操作。我是用多线程的,会有多个httpwebrequest的实例进行相关的get或post方式的请求数据;多个线程几乎都是同时获取要登录的网站,然后再用post方式登录;(请注意接下来的描述)多线程同时登录(用不同的帐号)没问题,都能成功登录,进去之后在操作(说明一下,从获取网站登录到之后的操作都设计成为全自动的)的过程中出会用到post方式请求页面,但问题就来了,这时竟然发现只有其中的两个线程能正常返回所需要的数据,而另一线程则在httpwebrequest.getrespond()上出现了异常,catch到了“远程服务器返回错误: (500) 内部服务器错误。”的提示,具体内容大致如下:
*********内容引用***********
<html>
    <head>
        <title>运行时错误</title>
        <style>
         ...///html一些元素的标记,与问题完全无关,为了节省空间,故用"..."略,下类似。
        </style>
    </head>
    <body bgcolor="white">
            <span><H1>“/”应用程序中的服务器错误。<hr width=100% size=1 color=silver></H1>
            <h2> <i>运行时错误</i> </h2></span>
            <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">
            <b> 说明: </b>服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止远程查看应用程序错误的详细信息(出于安全原因)。但可以通过在本地服务器计算机上运行的浏览器查看。
            <br><br>
            <b>详细信息:</b> 若要使他人能够在远程计算机上查看此特定错误消息的详细信息,请在位于当前 Web 应用程序根目录下的“web.config”配置文件中创建一个 &lt;customErrors&gt; 标记。然后应将此 &lt;customErrors&gt; 标记的“mode”属性设置为“Off”。<br><br>
           ...
&lt;!-- Web.Config 配置文件 --&gt;
          ...
&lt;configuration&gt;
    &lt;system.web&gt;
        &lt;customErrors mode=&quot;Off&quot;/&gt;
    &lt;/system.web&gt;
&lt;/configuration&gt;</pre></code>
            <b>注释:</b> 通过修改应用程序的 &lt;customErrors&gt; 配置标记的“defaultRedirect”属性,使之指向自定义错误页的 URL,可以用自定义错误页替换所看到的当前错误页。<br><br>
      ...
</body>
</html>
**********内容引用结束*************
题还未结束。如果我在程序里只用一个帐号登录(也就相当于一个线程),登录后进行操作都没种问题发生。还有,如果运行多个该程序的实例(大家都知道C#做成的程序每双击一次程序就会运行一个该程序,这就是一个程序实例),然后每个程序只用一个帐号进行登录,再进行登录之后的操作则不会发生该问题。
这问题在网站查找了很久,都没有有效的解决方案。包括一些人提到的设置request.ServicePoint.ConnectionLimit = int.MaxValue也一样没有解决到问题(同时我也在winform的构造函数里public Form1(){}加上System.Net.ServicePointManager.DefaultConnectionLimit = int.MaxValue;这一句,同样也没起到效果)。我在想是不是网站限制应用程序的多线程数为2,但我是模拟httpwebrequest进行操作的,网站应该不知道我是用应用程序进行的;如果真是这样,那网站是如何得知我是用应用程序的?通过什么方式知道的?
不知有没有人遇到过这样的问题?可有大虾知道解决的方法,小弟不胜感激!一点点分数不成敬意。