为什么尝试打开连接时会抛出异常?

时间:2011-12-08 08:44:56

标签: c# asp.net azure

打开连接时,我的C#代码中出现异常。 Visual Studio抛出一个异常,说'连接未关闭。连接的当前状态是打开的。'奇怪的是连接根本没有打开。

奇怪的是,问题只发生在一台PC(PC-1)上。在另外两台PC(PC-2和PC-3)上,代码在其他两台PC上编译并运行良好,没有任何异常抛出。如果我从那些PC-2或PC-3部署到Azure,一切正常。

所有3台PC都具有相同版本的Visual Studio 2010 SP1(10.0.40219.1 SP1Rel),.NET(4.0.30319 SP1Rel),Azure 1.6 SDK,Azure Ap Fabric 1.5.37和VS2010的Azure工具(1.6.41103.1601)

以下是代码的相关部分:

   private long[] Foo(long rId, long mItemId)
    {
        List<long> list = null;

        using (myDBEntities ctx = new myDBEntities())
        {
            EntityConnection entityConnection = (EntityConnection)ctx.Connection;

            using (DbConnection connection = entityConnection.StoreConnection)
            {
                connection.Open();
                ...

以下是完整的异常详情:

System.InvalidOperationException was unhandled by user code
Message=The connection was not closed. The connection's current state is open.
Source=System.Data
StackTrace:
    at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
    at System.Data.SqlClient.SqlConnection.Open()
    at myPost.Models.Repository.Foo(Int64 rId, Int64 mItemId) in C:\code\Models\Repository.cs:line 326
    at myPost.Models.Repository.Foo(Int64 menuItemId, Int64 rId, mItemRatings[]& ratings, Photos[]& thumbnails) in C:\code\Models\Repository.cs:line 92
    at myPost.Controllers.HomeController.Index(String part1, String part2, String embed) in C:\code\Controllers\HomeController.cs:line 97
    at lambda_method(Closure , ControllerBase , Object[] )
    at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
    at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
InnerException: 

在问题PC(PC-1)上,为了让代码运行,我必须在connection.Close();之前添加connection.Open();。但是,这会破坏PC-2和PC-3,更糟糕的是,当我部署到Azure时,我会抛出异常,因为我添加的connection.Close()不是必需的。

我不知道PC-1上的设置有什么问题,因为它似乎是配置问题,而不是代码问题。

1 个答案:

答案 0 :(得分:0)

同意它可能不是代码问题。在继续之前,只需快速测试连接是打开还是关闭 - 无论如何最好这样做。类似的东西:

if (connection.State == System.Data.ConnectionState.Open)
{
     // ahoy, mate!
}
else
{
    connection.Open();
    // here be dragons
}

我的一切都是为了找到机器中的幽灵,但有时候更容易进行状态检查,继续你的生活。