5

He estado usando el nuevo marco MVC con StructureMap recientemente y he tenido buenos resultados en general, sin embargo, sigo corriendo en un error muy extraño que no puedo entender o trabajar cómo resolverlocomportamiento extraño con StructureMap/ASP.MVC/Visual Studio/LinqToSql

Ésta es mi arquitectura:

  • DBContext - LinqToSql contexto de datos.
  • IRepository: método de definición de datos de contrato.
  • IServicio - métodos de servicio que definen el contrato.
  • Controladores: dos en este ejemplo.

por lo tanto tengo:

public class Repo : IRepository 
{ 
    public Repo(DBContext db) 
    { 
     ..... 
    } 
} 

public class Service : IService 
{ 
    public Service(IRepository repo) 
    { 
     ..... 
    } 
} 

public class ControllerOne : Controller 
{ 
    public ControllerOne(IService service) 
    { 
     ..... 
    } 
} 

public class ControllerTwo : Controller 
{ 
    public ControllerTwo(IService service) 
    { 
     ..... 
    } 
} 

StructureMap se utiliza para definir los tipos de hormigón para IRepository y IService y la DBContext se construye mediante la expresión lambda -() => nueva DBContext() configurado por DSL registro.

No hay almacenamiento en caché de la DBContext en la actualidad

Sobre el problema:

Mi página de índice cargas y hace dos peticiones Ajax simultáneas a ControllerOne y ControllerTwo, que se construyen a través de la fábrica de controlador StructureMap de MvcContrib.

StructureMap está inyectando los tipos concretos de IService, que a su vez se crean con el ejemplo IRepository configurado y un nuevo objeto DBContext.

ControllerOne está solicitando un modelo de la instancia de IService, que luego se devuelve como un JsonActionResult, que es renderizado por Newtonsoft.Json.

ControllerTwo está solicitando un modelo diferente de la instancia IService, que también es serializado a un objeto JSON cuando el marco MVC ejecuta el ActionResult.

Me postulo la página web a través de Cassini en VS2008.

El problema que veo de vez en cuando es un error generado desde dentro LinqToSql

  • datos no se pueden leer, ya hay un lector abierto o
  • no puede cargar datos en una tabla de datos como el los datos ya existen (no tengo las excepciones exactas a la mano en este momento, pero ambos son internos a LinqToSql).

Si el error ocurre en ControllerOne, entonces ControllerTwo también producirá un error similar, como si las dos solicitudes se ejecutaran con objetos compartidos.

No de error todo el tiempo pero es suficiente para que me preocupa mi arquitectura y que está configurado mal de alguna manera.

¿Hay alguna manera de que StructureMap pueda devolver la misma instancia de ControllerOne y ControllerTwo en solicitudes posteriores, o si está almacenando en caché el DBContext de alguna manera? Aunque no lo estoy pidiendo?

¿Alguien ha visto algo similar cuando se trabaja en Visual Studio/Cassini? ¿Funciona la ayuda de IIS?

¿Debo eliminar LinqToSql?

Cerrar Visual Studio y abrir de nuevo a menudo puede resolver el problema por un tiempo.

Muchas gracias si alguien puede arrojar alguna luz sobre el problema.

EDIT: Incluyendo fragmento de registro de archivo de registro Nlog (ID del tema es el número antes del punto y coma):

03/20/2009 01:40:32 12: controller=Timesheet,date=2001-05-06,Action=WeekEnding /beta/Timesheet/2001-05-06?_dc=1237513232397 
03/20/2009 01:40:32 10: controller=Timesheet,date=2001-05-06,Action=WeekEnding /beta/Timesheet/2001-05-06?_dc=1237513232449 
03/20/2009 01:40:32 10: There is already an open DataReader associated with this Command which must be closed first. System.InvalidOperationException[br] at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) 
    at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) 
    at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) 
    at System.Data.Common.DbCommand.ExecuteReader() 
    at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) 
    at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) 
    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
    at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression) 
    at System.Linq.Queryable.Sum[TSource](IQueryable`1 source, Expression`1 selector) 
    at HCD.Intranet.Core.Data.Linq.LinqEmployeeRepository.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding, Int32 nonProjectId) 
    at HCD.Intranet.Core.Services.Impl.EmployeeService.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding) 
    at HCD.Intranet.Core.Models.Timesheet.CalculateHolidaysRemaining() 
    at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteTimesheet(JsonWriter writer, Timesheet timesheet) 
    at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteJson(JsonWriter writer, Object value) 
    at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter) 
    at Newtonsoft.Json.JsonSerializer.WriteMemberInfoProperty(JsonWriter writer, Object value, JsonMemberMapping memberMapping) 
    at Newtonsoft.Json.JsonSerializer.SerializeObject(JsonWriter writer, Object value) 
    at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter) 
    at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value) 
    at HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext context) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 
03/20/2009 01:40:32 12: Invalid attempt to call Read when reader is closed. System.InvalidOperationException[br] at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) 
    at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) 
    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
    at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression) 
    at System.Linq.Queryable.Sum[TSource](IQueryable`1 source, Expression`1 selector) 
    at HCD.Intranet.Core.Data.Linq.LinqEmployeeRepository.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding, Int32 nonProjectId) 
    at HCD.Intranet.Core.Services.Impl.EmployeeService.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding) 
    at HCD.Intranet.Core.Models.Timesheet.CalculateHolidaysRemaining() 
    at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteTimesheet(JsonWriter writer, Timesheet timesheet) 
    at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteJson(JsonWriter writer, Object value) 
    at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter) 
    at Newtonsoft.Json.JsonSerializer.WriteMemberInfoProperty(JsonWriter writer, Object value, JsonMemberMapping memberMapping) 
    at Newtonsoft.Json.JsonSerializer.SerializeObject(JsonWriter writer, Object value) 
    at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter) 
    at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value) 
    at HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext context) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 
03/20/2009 01:41:58 12: controller=Timesheet,month=6,year=2001,Action=Calendar /beta/Timesheet/Calendar/6/2001?_dc=1237513318470 
03/20/2009 01:41:59 10: controller=Timesheet,date=2001-06-03,Action=WeekEnding /beta/Timesheet/2001-06-03?_dc=1237513318509 
03/20/2009 01:41:59 12: The null value cannot be assigned to a member with type System.Int32 which is a non-nullable value type. System.InvalidOperationException[br] at Read_TimesheetEntry(ObjectMaterializer`1) 
    at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at HCD.Intranet.Core.Data.Linq.LinqTimesheetRepository.GetEntries(Int32 timesheetHeaderId) 
    at HCD.Intranet.Core.Services.Impl.TimesheetService.GetEntries(Int32 timesheetHeaderId) 
    at HCD.Intranet.Core.Models.Timesheet.get_InnerEntries() 
    at HCD.Intranet.Core.Models.TimeMap..ctor(Timesheet timesheet) 
    at HCD.Intranet.Core.Models.Json.TimesheetCalendarJsonConverter.WriteTimesheet(JsonWriter writer, Timesheet[] timesheets) 
    at HCD.Intranet.Core.Models.Json.TimesheetCalendarJsonConverter.WriteJson(JsonWriter writer, Object value) 
    at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter) 
    at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value) 
    at HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext context) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 
03/20/2009 01:41:59 12: controller=Timesheet,date=2001-06-03,Action=WeekEnding /beta/Timesheet/2001-06-03?_dc=1237513318545 
03/20/2009 01:41:59 12: There is already an open DataReader associated with this Command which must be closed first. System.InvalidOperationException[br] at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) 
    at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) 
    at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) 
    at System.Data.Common.DbCommand.ExecuteReader() 
    at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) 
    at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) 
    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
    at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression) 
    at System.Linq.Queryable.Sum[TSource](IQueryable`1 source, Expression`1 selector) 
    at HCD.Intranet.Core.Data.Linq.LinqEmployeeRepository.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding, Int32 nonProjectId) 
    at HCD.Intranet.Core.Services.Impl.EmployeeService.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding) 
    at HCD.Intranet.Core.Models.Timesheet.CalculateHolidaysRemaining() 
    at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteTimesheet(JsonWriter writer, Timesheet timesheet) 
    at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteJson(JsonWriter writer, Object value) 
    at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter) 
    at Newtonsoft.Json.JsonSerializer.WriteMemberInfoProperty(JsonWriter writer, Object value, JsonMemberMapping memberMapping) 
    at Newtonsoft.Json.JsonSerializer.SerializeObject(JsonWriter writer, Object value) 
    at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter) 
    at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value) 
    at HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext context) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 
03/20/2009 01:41:59 10: Invalid attempt to call Read when reader is closed. System.InvalidOperationException[br] at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) 
    at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) 
    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
    at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression) 
    at System.Linq.Queryable.Sum[TSource](IQueryable`1 source, Expression`1 selector) 
    at HCD.Intranet.Core.Data.Linq.LinqEmployeeRepository.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding, Int32 nonProjectId) 
    at HCD.Intranet.Core.Services.Impl.EmployeeService.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding) 
    at HCD.Intranet.Core.Models.Timesheet.CalculateHolidaysRemaining() 
    at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteTimesheet(JsonWriter writer, Timesheet timesheet) 
    at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteJson(JsonWriter writer, Object value) 
    at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter) 
    at Newtonsoft.Json.JsonSerializer.WriteMemberInfoProperty(JsonWriter writer, Object value, JsonMemberMapping memberMapping) 
    at Newtonsoft.Json.JsonSerializer.SerializeObject(JsonWriter writer, Object value) 
    at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter) 
    at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value) 
    at HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext context) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 
+0

¿Puedes publicar la configuración y la versión del mapa de tu estructura? – Schneider

+0

PS Esta es la excepción que definitivamente es causada por un dbcontext que se reutiliza. Tuve un error similar una vez cuando las solicitudes múltiples (~ hilos) – Schneider

Respuesta

6

estaba hablando con Jeremy Miller acerca de esto y que No desea administrar el tiempo de vida del contexto db con SM - dejar que el instantiate cesión temporal, según sea necesario. Esto presenta problemas con la forma en que hará la actualización/persistencia del objeto (si está confiando en un contexto que se mantiene activo para más de una solicitud), pero vale la pena no confíe en esto para una aplicación web.

Tuve que eliminar las cosas de administración de contexto de db de la tienda por una razón como esta: estaba obteniendo pérdidas de memoria. No diré que es culpa de SM, pero en general solo deje que el repositorio abra un nuevo contexto.

+0

Gracias Rob, eso es muy interesante. La administración de DbContext se basó en el código de la tienda. ¿Hay más información para explicar este problema y cómo lo identificó? Comprobaré que esta es la solución esta noche y retroalimentaré. –

+0

En mi caso, mis repositorios están renovando su propio DBContext cada vez que se crea el repositorio (por ejemplo, manualmente en el constructor, no usando 'using() {}' según el código del escaparate), mis pensamientos previos y post de Phils me señalan a los repos que estaban siendo compartidos y no recién creados. – ChadT

+0

@Rob - Hice la corrección y parecía haber solucionado el problema, pero lo volví a ver anoche. Mi repositorio ahora construye su propio DbContext en el nivel de constructor. Estoy pensando en moverlo al nivel de método dentro de una declaración de uso. @DaRKoN - ¿Ha progresado su problema? –

1

Añadir:

MultipleActiveResultSets=True 

Para el final de la cadena de conexión (suponiendo MSSQL 2005 +)

Para hacer esto para su contexto de linq: Abra la pestaña de propiedades -> Expandir conexión -> Haga clic en "..." en 'Cadena de conexión' -> 'Avanzado' -> 'MultipleActiveRe sultSets '-> verdadero.

Resolví este yo mismo hoy y mi arquitectura es casi idéntica (salvo por la unidad en lugar del mapa de la estructura). ¡Incluyendo los dos controladores cargados a través de JS!

+0

@DaRKoN compartieron el dbcontext único - gracias. ¿Tienes más explicación de por qué esta es la solución? es decir, ¿qué está haciendo LinqToSql? Esperaría una consulta de linq para abrir el lector y cerrarlo. No debe haber lectores abiertos en una conexión. Tampoco hay llamadas de datos síncronas, todo está dentro del único hilo. –

+1

Probablemente esté equivocado, pero debido a la inyección de dependencia, las dos acciones del controlador comparten el mismo contexto de datos. JS los solicita virtualmente al mismo tiempo, por lo que existe la posibilidad de que la solicitud siga abierta cuando llegue la otra solicitud. Me gustaría escuchar sus opiniones sobre esto también – ChadT

+0

. Me sorprendería que este fuera el caso, ya que ambos los controladores están siendo creados por el contenedor de objetos, que usará un DBContext diferente para cada uno. Esperaría que las dependencias se conectaran en cascada como nuevas instancias. PERO algo de caché como este debe estar sucediendo en algún lugar para dar como resultado el error que obtengo –

2

Un error común al usar contenedores DI con ASP.NET MVC es que muchos contenedores DI tienen un patrón Singleton predeterminado. No sé si ese es el caso aquí, pero deberían verificarlo dos veces. ASP.NET MVC requiere que el controlador se cree en cada solicitud porque tiene estado y contexto por solicitud.

+0

Gracias Phil, pero yo diría que los controladores se están creando por solicitud. Solo estoy utilizando la fábrica de controladores MvcContrib cableada según sus ejemplos. Los métodos ObjectFactory.GetInstance de StructureMap devuelven nuevas instancias del tipo solicitado. ¡Seguiré cavando! –

+0

Phil, gracias por explicar este punto. Tenía la impresión (estoy seguro de que lo leí en alguna parte) de que mi contenedor DI estaba configurado para ser solicitado por defecto y resulta que no es así. – ChadT

+0

@Haacked Structure Map se establece por defecto en uno nuevo cada vez. ¿Sabes si mvccontrib (o mvc) reutilizan las instancias? – eglasius

1

¿Está completamente seguro de que nada a lo largo de la jerarquía de objetos se está almacenando en caché/o tiene una configuración de por vida? Tengo una aplicación prod con una configuración como esta:

ForRequestedType<SomeDataContext>().TheDefault.Is.ConstructedBy(
     () => new SomeDataContext(someConnString); 

No está utilizando asp.net MVC. En cuanto al problema del alcance, si no ha configurado nada, el mapa de estructura se establecerá de forma predeterminada en PerRequest (no en la solicitud asp.net sino en la solicitud del mapa de estructura, como cada llamada .GetInstance) - http://structuremap.sourceforge.net/Scoping.htm. Si está seguro de que no hay configuración que lo afecte, mire si el contrv de mvc u otra cosa podría estar reutilizando instancias.


En cuanto a la información de excepción publicada. El error implica una combinación de resultados de acción, filtros de resultado de acción, serialización json, métodos personalizados y también una llamada linq2sql que falla debido a un nulo inesperado. Esa es una combinación de muchas piezas diferentes, algunas de las cuales no sé. Jugaría más seguro y movería las cosas de cálculo (llamadas a linq2sql) que se invocan al hacer serialización a otro lugar donde las piezas de resultados de serialización/acción de json no están involucradas.Esto es solo una suposición descabellada, ya que no sé cómo/cuándo se llaman esas piezas y qué tipo de acciones tienen internamente.

+0

@Freddy - gracias. el problema ha vuelto, así que vuelvo a encontrar un problema de alcance. La compilación de objetos que mvc está utilizando llama a GetInstance cada vez que se solicita un controlador: ¿cómo funcionará esto con el alcance? ¿Alguna vez recibiré la misma instancia de controlador dos veces? Sospecho que esto está sucediendo. –

+0

@Tim, ya que ha pasado un tiempo, por favor publique las excepciones que está recibiendo. También considere ejecutarlo utilizando la fuente contrib de mvc. No sé mucho sobre el contrib del mvc, lo exploro un poco y me pregunto si los subcontroladores pueden causar algo como esto (no mencionaste esos pensamientos). – eglasius

+0

@Tim cuando se depura con el origen, se establece un punto de interrupción en el constructor de contexto y se ejecuta con él para ver dónde y cuándo se está creando una instancia. – eglasius