none
【ASP.NET】请求高手帮助解决Server Error in '/' Application.问题 RRS feed

  • 问题

  • 似乎网站点链接几下就出现Server Error in '/' Application.错误,小弟找了半天没找到问题究竟出在哪里。在本地测试一点问题都没有,上传到虚拟空间用外网测试点击其中的链接没等几下就出现问题。重新上传Web.config文件问题解决,但再次点击其中的链接几遍又会出现上述问题。小弟怀疑是CPU资源不够,自己在本地测试了一下,用的CPU值根本不高,并和虚拟服务器商取得了联系也帮我放大了CPU限制,问题还是依旧。在网上也找了下资料,有人说是编码问题。而且我发现每个页面的Head编码如:<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 发现web.config里的<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-CN" uiCulture="zh-CN"/>是uft-8与页面不符,之后我去掉了web.config里面那句话。问题还存在,根据我的经验仔细分析了一下,编码错误不能导致Application.问题,如果导致也是引起页面乱码错位什么的。难道和Ajax.net控件有关,因为这个项目头次运用到了Ajax控件,会不会是它引起的呢?请高手帮忙分析一下,小弟表示万分感激!

    web.config代码如下:

    <?xml version="1.0"?>
    <!--
        注意: 除了手动编辑此文件以外,您还可以使用
        Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
         “网站”->“Asp.Net 配置”选项。
        设置和注释的完整列表在
        machine.config.comments 中,该文件通常位于
        \Windows\Microsoft.Net\Framework\v2.x\Config 中
    -->
    <configuration>
      <configSections>
        <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
          <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>
            <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
              <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere"/>
              <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>
              <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>
            </sectionGroup>
          </sectionGroup>
        </sectionGroup>
      </configSections>
     
      <connectionStrings>
        <add name="YuChengConnectionString1" connectionString="Data Source=218.61.0.22;Initial Catalog=YuCheng;Integrated Security=True;MultipleActiveResultSets=False;Packet Size=4096;Application Name=&quot;Microsoft SQL Server Management Studio&quot;"
          providerName="System.Data.SqlClient" />
        <add name="YuChengConnectionString2" connectionString="Data Source=218.61.0.22;Initial Catalog=YuCheng;Integrated Security=True;MultipleActiveResultSets=False;Packet Size=4096;Application Name=&quot;Microsoft SQL Server Management Studio&quot;"
          providerName="System.Data.SqlClient" />
      </connectionStrings>
      <appSettings>
        <add key="ConnectionString" value="Data Source=.;Initial Catalog=yucheng;Persist Security Info=True;User ID=sa;Password=admin"></add>
       
      </appSettings>
      <system.web>
        <pages validateRequest="false">
          <controls>
            <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          </controls>
        </pages>
        <!--
              Set compilation debug="true" to insert debugging
              symbols into the compiled page. Because this
              affects performance, set this value to true only
              during development.
        -->
        <compilation debug="true" defaultLanguage="c#">
          <assemblies>
            <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
            <add assembly="System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
            <add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
            <add assembly="System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
            <add assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
            <add assembly="System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
            <add assembly="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
            <add assembly="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
          </assemblies>
        </compilation>
        <httpHandlers>
          <remove verb="*" path="*.asmx"/>
          <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
        </httpHandlers>
        <httpModules>
          <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        </httpModules>
        <!--<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-CN" uiCulture="zh-CN"/>-->
        <httpRuntime executionTimeout="300" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"/>
      </system.web>
      <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
        <modules>
          <add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        </modules>
        <handlers>
          <remove name="WebServiceHandlerFactory-Integrated"/>
          <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        </handlers>
      </system.webServer>
    </configuration>

    抱歉以上为了安全考虑我去掉了远程SQL的服务器相关信息,只是本地。望高手见谅!
    2009年12月31日 4:26

答案

  • 你好, 可能你的页面存在数据库执行时间非常长的查询,或者数据库打开后没有关闭,尤其是Reader没有释放资源,导致资源紧张。而且往往这些问题在本地开发环境中不易察觉。

    另外,数据库资源紧张导致需要重起启动应用程序才能恢复,而你重新上传配置文件,可以导致应用程序重起启动,所以,问题我觉得不在配置文件上。

    你也可以试验一下,出现问题时候,不要重新上传配置文件,重新启动IIS也能达到相同的效果,这就说明你的程序有问题,要么数据库访问的问题,要么数据库查询的问题,要么有死循环。
    2009年12月31日 9:37
    版主
  • 你好!

    这是你的连接池满了。一般是由于在你的代码中使用完 Connecton 后没有及时关闭造成的。或者你的 Command 执行效率不高或并发高。

    如果是代码问题可以在使用 connection 时使用 using

    using(SqlConnection conn = new SqlConnection("ConnectionString"))
    {
    //
    }

    或者在连接字符串中增加你的连接池上限。

    server=yourServer;uid=yourId;pwd=yourPwd;database=yourDataBase;Max Pool Size = 512

    知识改变命运,奋斗成就人生!
    2009年12月31日 9:51
    版主

  • SqlConnection
    SqlDataReader用完后最好都要显示关闭

    using(SqlConnection conn = new SqlConnection("ConnectionString"))
    {

        SqlCommand cmd = new SqlCommand();
                SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                dr.Read();
    //读取数据

                dr.Close();

    //
    }

    努力+方法=成功
    2009年12月31日 10:05

全部回复

  • http://blog.csdn.net/lovnov/archive/2009/09/02/4509608.aspx 参考
    2009年12月31日 4:46
  • 你好!

    在 web.config 中增加下面的节点,看看原始错误信息是什么。

    <configuration>
        <system.web>
            <customErrors mode="Off"/>
        </system.web>
    </configuration>

    知识改变命运,奋斗成就人生!
    2009年12月31日 4:46
    版主
  • 你好!

    在 web.config 中增加下面的节点,看看原始错误信息是什么。

    <configuration>
        <system.web>
            <customErrors mode="Off"/>
        </system.web>
    </configuration>

    知识改变命运,奋斗成就人生!

     你好,用你的方法远程查看错误为Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached. 在网上查了一下,说是SqlCommand.CommandTimeout的超时时间过短,那么请问版主,这个事件在web.config中可以设置么?如何来设置。谢谢!
    2009年12月31日 9:30

  • 可以通过两种方式设置

    1.
      可以在你的程序里面设置
     
             SqlCommand cmd = new SqlCommand("",con);
                cmd.CommandTimeout = 10000;
    2.
    asp.net程序可以在webconfig里面加上下面的代码:
    <configuration>
       ...
    <system.web>
        <httpRuntime executionTimeout="10000"/>
    </system.web>
    </configuration>

    努力+方法=成功
    2009年12月31日 9:35
  • 你好, 可能你的页面存在数据库执行时间非常长的查询,或者数据库打开后没有关闭,尤其是Reader没有释放资源,导致资源紧张。而且往往这些问题在本地开发环境中不易察觉。

    另外,数据库资源紧张导致需要重起启动应用程序才能恢复,而你重新上传配置文件,可以导致应用程序重起启动,所以,问题我觉得不在配置文件上。

    你也可以试验一下,出现问题时候,不要重新上传配置文件,重新启动IIS也能达到相同的效果,这就说明你的程序有问题,要么数据库访问的问题,要么数据库查询的问题,要么有死循环。
    2009年12月31日 9:37
    版主
  • 你好!

    这是你的连接池满了。一般是由于在你的代码中使用完 Connecton 后没有及时关闭造成的。或者你的 Command 执行效率不高或并发高。

    如果是代码问题可以在使用 connection 时使用 using

    using(SqlConnection conn = new SqlConnection("ConnectionString"))
    {
    //
    }

    或者在连接字符串中增加你的连接池上限。

    server=yourServer;uid=yourId;pwd=yourPwd;database=yourDataBase;Max Pool Size = 512

    知识改变命运,奋斗成就人生!
    2009年12月31日 9:51
    版主

  • 可以通过两种方式设置

    1.
      可以在你的程序里面设置
     
             SqlCommand cmd = new SqlCommand("",con);
                cmd.CommandTimeout = 10000;
    2.
    asp.net程序可以在webconfig里面加上下面的代码:
    <configuration>
       ...
    <system.web>
        <httpRuntime executionTimeout="10000"/>
    </system.web>
    </configuration>

    努力+方法=成功
    你好请问这里的<httpRuntime executionTimeout="10000"/>10000指的是SqlCommand 的超时时间么?原先是300,按照你的我修改到了10000,可问题还是依旧,不一会就出现问题了。
    在网上有人说,特别是SqlDataReader 要显示关闭,.NET程序只会帮你关闭SqlConnection,并不会关闭SqlDataReader  有人说要显示关闭SqlDataReader  不知道他们说的对不对,还请过来人帮忙纠正。谢谢

    2009年12月31日 9:53

  • SqlConnection
    SqlDataReader用完后最好都要显示关闭

    using(SqlConnection conn = new SqlConnection("ConnectionString"))
    {

        SqlCommand cmd = new SqlCommand();
                SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                dr.Read();
    //读取数据

                dr.Close();

    //
    }

    努力+方法=成功
    2009年12月31日 10:05

  • SqlConnection
    SqlDataReader用完后最好都要显示关闭

    using(SqlConnection conn = new SqlConnection("ConnectionString"))
    {

        SqlCommand cmd = new SqlCommand();
                SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                dr.Read();
    //读取数据

                dr.Close();

    //
    }

    努力+方法=成功

    你好,这个问题我非常的关心。像我这个方法
     static public SqlDataReader GetSqlDataReader(string procName)
        {

            SqlCommand cmd = GetSqlCommand(procName);
            SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            sdr.Close();
            return sdr;
        }

    这样写的话,还能返回sdr对象么?

    2009年12月31日 10:07
  • 如果按你的写法是不能返回SqlDataReader
    这样写
    static public SqlDataReader GetSqlDataReader(string procName)
        {

            SqlCommand cmd = GetSqlCommand(procName);
            SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            
            return sdr;
        }


    努力+方法=成功
    2009年12月31日 10:13
  • 如果按你的写法是不能返回SqlDataReader
    这样写
    static public SqlDataReader GetSqlDataReader(string procName)
        {

            SqlCommand cmd = GetSqlCommand(procName);
            SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            
            return sdr;
        }


    努力+方法=成功
     那我明白了,由于我在返回之前关闭了sdr,就不能返回 sdr了,是这样吧?前面的例子我是这样调用的

            using (SqlDataReader reader = OperateDB.GetSqlDataReader("select about from tb_other"))
            {
                while (reader.Read())
                {
                    this.FreeTextBox1.Text = reader["about"].ToString();
                }
            }
    这样是否就关闭了sdr对象 与 con连接呢?期盼您的回复,谢谢!
    2009年12月31日 10:17
  • 如果按你的写法是不能返回SqlDataReader
    这样写
    static public SqlDataReader GetSqlDataReader(string procName)
        {

            SqlCommand cmd = GetSqlCommand(procName);
            SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            
            return sdr;
        }


    努力+方法=成功
     那我明白了,由于我在返回之前关闭了sdr,就不能返回 sdr了,是这样吧?前面的例子我是这样调用的

            using (SqlDataReader reader = OperateDB.GetSqlDataReader("select about from tb_other"))
            {
                while (reader.Read())
                {
                    this.FreeTextBox1.Text = reader["about"].ToString();
                }
            }
    这样是否就关闭了sdr对象 与 con连接呢?期盼您的回复,谢谢!

    建议你重新写连接数据库读取数据方式比较好 越简单越好 像你这样写这么复杂 没法调用cn.close方法  要么都写在一个方法 要么连接类当引用参数
    2009年12月31日 10:56
  • 如果按你的写法是不能返回SqlDataReader
    这样写
    static public SqlDataReader GetSqlDataReader(string procName)
        {

            SqlCommand cmd = GetSqlCommand(procName);
            SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            
            return sdr;
        }


    努力+方法=成功
     那我明白了,由于我在返回之前关闭了sdr,就不能返回 sdr了,是这样吧?前面的例子我是这样调用的

            using (SqlDataReader reader = OperateDB.GetSqlDataReader("select about from tb_other"))
            {
                while (reader.Read())
                {
                    this.FreeTextBox1.Text = reader["about"].ToString();
                }
            }
    这样是否就关闭了sdr对象 与 con连接呢?期盼您的回复,谢谢!

    你重新写连接数据库读取数据方式比较好 越简单越好 像你这样写这么复杂 没法调用cn.close方法  要么都写在一个方法 要么连接类当引用参数

    你好,能否针对这个问题回答下,谢谢 
        using (SqlDataReader reader = OperateDB.GetSqlDataReader("select about from tb_other"))
            {
                while (reader.Read())
                {
                    this.FreeTextBox1.Text = reader["about"].ToString();
                }
            }
    使用using结束的时候释放了SqlDataReader 对象,而在GetSqlDataReader方法中使用了 SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    其中的CommandBehavior.CloseConnection引发,所以在using结束的时候关闭了SqlDataReader 对象而又关闭了SqlConnection连接,这是我的理解,不知道这样理解对不对?
    2009年12月31日 11:02
  • 解决好大的问题哦!!
    2010年1月14日 13:44