首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server的.net mvc 4 web服务连接问题

Server的.net mvc 4 web服务连接问题
EN

Stack Overflow用户
提问于 2013-08-30 15:22:52
回答 1查看 2.9K关注 0票数 1

安装程序

我们有一个.net mvc 4 web服务层,它通过一个web应用程序访问,该应用程序从Server 2008数据库获取数据。

问题

当同时向web服务发出超过5个GET请求时,将向web应用程序返回一个500 Interal Server Error。当我仔细查看.net错误时,我会看到以下内容:

发生错误。 连接没有关闭。连接的当前状态是打开的

异常抛出的C#服务代码:

代码语言:javascript
复制
public class ImageLinkRepository : IImageLinkRepository
{
  private SqlConnection cnnSQL = new SqlConnection(...);

  public IEnumerable<ImageLink> Get(String userId)
        {

            ImageLinks = new List<ImageLink>();

            // open connection to DB
            cnnSQL.Open();

            try
            {
                SqlCommand cmmSQL = new SqlCommand("nVision_select_lcimagelinks_sp", cnnSQL);
                cmmSQL.CommandType = System.Data.CommandType.StoredProcedure;

                SqlParameter prmSQL = cmmSQL.Parameters.Add(new SqlParameter
                {
                    ParameterName = "@LCIMGLINKUSERID",
                    Value = userId
                });

                SqlDataReader rdrSQL = cmmSQL.ExecuteReader();

                if (rdrSQL.HasRows)
                {
                    while (rdrSQL.Read())
                    {
                        ImageLinks.Add(new ImageLink 
                        { 
                            // set new ImageLink object's properties    
                            imageTopicId = DBReader.SQLString(rdrSQL, "LCIMGLINKIMGTOPICID"), 
                            id = DBReader.SQLInt(rdrSQL, "LCIMGLINKPK"),
                            recordId = DBReader.SQLString(rdrSQL, "LCIMGLINKRECORDID"),
                            text = DBReader.SQLString(rdrSQL, "LCIMGLINKTEXT"),
                            topicId = DBReader.SQLString(rdrSQL, "LCIMGLINKTOPICID"),
                            topicItem = DBReader.SQLString(rdrSQL, "LCIMGLINKTOPICITEM"),
                            url = DBReader.SQLString(rdrSQL, "LCIMGLINKURL"),
                            user = DBReader.SQLString(rdrSQL, "LCIMGLINKUSERID")
                        });
                    }
                }    
            }

            // close connection to DB
            cnnSQL.Close();

            return ImageLinks;
        }
}

如果连接是打开的,我尝试手动关闭连接,并且只有当连接关闭时才尝试打开连接,它们都不能工作。

我一定做错了什么,当然,服务应该能够同时处理请求。我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-30 15:35:49

您可能会耗尽SQL连接池。首先,您应该使用SqlCommandSqlConnectionSqlReaders语句包装using()语句,以确保它们被正确地处理和关闭。

构建为字段的SqlConnection意味着您的控制器必须负责处理它。在方法中构造它更容易,在方法中也可以将其封装在using()中(否则您的类应该实现IDisposable(),依次调用连接上的.Dispose() )。

代码语言:javascript
复制
try
{
  using (var cnnSQL = new SqlConnection(...))
  {
    using (var cmmSQL = new SqlCommand("nVision_select_lcimagelinks_sp", cnnSQL))
    {
      cmmSQL.CommandType = System.Data.CommandType.StoredProcedure;

      SqlParameter prmSQL = cmmSQL.Parameters.Add(new SqlParameter
      {
          ParameterName = "@LCIMGLINKUSERID",
          Value = userId
      });

      using (var rdrSQL = cmmSQL.ExecuteReader())
      {
      ...
      }
    }
  {
} ...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18536433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档