.NET已经打开DataReader

时间:2018-01-25 13:29:08

标签: asp.net .net asp.net-mvc

运行此代码时出现此错误。我找了解决方案虽然我不喜欢使用MARS的想法,因为它可能包含大量数据,这里有其他选择吗?我也可以编辑数据库中的变量,而不像我在这里那样重写所有变量,这会节省服务器功率还是没有差别?

  

已经有一个与此命令关联的打开DataReader,必须先关闭它。

    public ActionResult CheckLinks(Link model)
    {
        var userId = User.Identity.GetUserId();
        var UserTableID = db.UserTables.Where(c => c.ApplicationUserId == userId).First().ID;
        foreach (var item in db.Links.Where(p => p.UserTable.ID == UserTableID))
        {
            string pageContent = null;

            HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(item.Obdomain);
            HttpWebResponse myres = (HttpWebResponse)myReq.GetResponse();

            using (StreamReader sr = new StreamReader(myres.GetResponseStream()))
            {
                pageContent = sr.ReadToEnd();
            }
            string live = "";
            if (pageContent.Contains(item.Obpage))
            {
                live = "Yes";
            }
            else { live = "No"; }

            var link = new Link { Obdomain = item.Obdomain, ClientID = item.ClientID, Obpage = item.Obpage, BuildDate = item.BuildDate, Anchor = item.Anchor, IdentifierID = item.IdentifierID, live = (Link.Live)Enum.Parse(typeof(Link.Live), live), UserTableID = item.UserTableID };
            db.Entry(link).State = EntityState.Modified;
            db.SaveChanges();
        }
        return RedirectToAction("Index");
    }

1 个答案:

答案 0 :(得分:2)

实体框架一次只允许每个上下文一个活动命令。您应该在以下语句的末尾添加.ToList()

db.Links.Where(p => p.UserTable.ID == UserTableID).ToList();

所以你的代码看起来像这样:

var items = db.Links.Where(p => p.UserTable.ID == UserTableID).ToList();
foreach (var item in items)