5

최근 StructureMap과 함께 새로운 MVC 프레임 워크를 사용하여 전반적으로 좋은 결과를 얻었지만 이해할 수 없거나 작동하지 않는 매우 이상한 오류가 발생했습니다 해결 방법을 찾아야합니다.StructMap/ASP.MVC/Visual Studio/LinqToSql의 이상한 동작

이 내 아키텍처 :

  • DBContext - linqToSql 데이터 컨텍스트.
  • IRepository - 계약을 정의하는 데이터 메소드.
  • IService - 서비스 메서드를 정의하는 계약.
  • 컨트롤러 -이 예제에서는 2 개.

    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가 IRepository 및 IService 콘크리트 종류를 정의하는데 사용되는 상기 DBContext는 람 바어 식으로 구성되는 - (+) => 새로운 DBContext() DSL 의해 구성되는

I 그러므로 가지고 기재.

내 인덱스 페이지가로드되고 StructureMap 컨트롤러 공장을 통해 구성된다 ControllerOne 및 ControllerTwo 두 개의 동시 Ajax 요청을 만드는 :이 문제 상에, 현재

에서 DBContext의 캐싱이없는

MvcContrib에서.

구조체 맵은 구성된 IRepository 인스턴스와 새 DBContext 개체를 사용하여 구체화 된 IService 유형을 주입합니다.

ControllerOne은 ISonvice 인스턴스에서 모델을 요청하고 있으며이 모델은 Newtonsoft.Json에서 렌더링 한 JsonActionResult로 반환됩니다.

컨트롤러는 MVS 프레임 워크가 ActionResult를 실행할 때 Json 객체로 직렬화되는 IService 인스턴스와 다른 모델을 요청하고 있습니다.

저는 VS2008의 Cassini를 통해 웹 사이트를 실행하고 있습니다.

문제 내가 땐보고하고는 LinqToSql 내에서 발생하는 오류입니다

  • 데이터는 이미 열려있는 리더 또는
  • 가 읽을 수없는
  • 는 AS 데이터 테이블에 데이터를로드 할 수 없습니다를 데이터가 이미 존재합니다 (현재는 예외가 없지만 둘 다 LinqToSql 내부입니다).

ControllerOne에서 오류가 발생하면 두 개의 요청이 공유 객체로 실행되는 것처럼 ControllerTwo도 유사한 오류로 실패합니다.

항상 오류는 아니지만 제 아키텍처에 대해 우려를 느끼기에 충분하며 어떤면에서는 잘못 구성되어 있습니다.

이후의 요청에서 StructureMap이 동일한 ControllerOne 및 ControllerTwo 인스턴스를 반환 할 수있는 방법이 있습니까? 아니면 어떤 방식 으로든 DBContext를 캐싱하고 있습니까? 비록 내가 그것을 요구하지 않습니까?

Visual Studio/Cassini에서 작업 할 때 비슷한 것을 본 사람이 있습니까? IIS를 통해 도움이됩니까?

LinqToSql을 제거해야합니까?

Visual Studio를 닫은 다음 다시 열면 잠시 동안 문제가 해결 될 수 있습니다.

누구든지 문제에 관해 밝힐 수 있으면 고맙습니다.

편집 :

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

구조 맵 구성 및 버전을 게시 할 수 있습니까? – Schneider

+0

추신 : 이것은 재사용되는 dbcontext로 인해 예외적으로 발생합니다. 하나의 dbcontext가 여러 요청 (~ threads)에 의해 공유되었을 때 나는 비슷한 오류를 가지고있었습니다. – Schneider

답변

6

나는 이것에 관해 Jeremy Miller와 이야기하고 있었다. 은 SM과 함께 db 컨텍스트의 수명을 관리하고 싶다 - 필요하다면 repo를 인스턴스화하게한다. 이것은 객체 업데이트/지속성 (둘 이상의 요청에 대해 살아있는 상황에 의존하는 경우)을 수행하는 방법에 문제가 있지만 이 아닌은 웹 앱에 의존합니다.

나는이 같은 이유로 스토어에서 db 컨텍스트 관리 항목을 제거해야했다. 나는 메모리 누수가 발생했다. 나는 그것이 SM의 잘못이라고는 말하지 않겠지 만 전반적으로 레포가 새로운 맥락을 열게한다.

+0

감사합니다. Rob, 매우 흥미 롭습니다. DbContext 관리는 상점 전면 코드를 기반으로했습니다. 이 문제를 설명하는 추가 정보가 있습니까? 어떻게 식별 했습니까? 나는 이것이 오늘 밤 해결책이고 다시 피드백을 확인할 것입니다. –

+0

필자의 경우 Repo가 생성 될 때마다 Repo가 자신의 DBContext를 새로 작성하고 있습니다 (예 : 생성자에서 수동으로 (상점 전선 코드별로 '{}'사용) 사용하지 않음), 이전 생각 및 Phils 게시글 공유되고 새롭게 생성되지 않은 리포에 – ChadT

+0

@Rob - 문제를 정리 한 것으로 보였지만 어제 밤에 다시 보았습니다. 내 repo는 이제 생성자 수준에서 자체 DbContext를 생성합니다. using 문에서 메서드 수준으로 옮길 생각입니다. @DaRKoN - 문제가 진행 되었습니까? –

1

추가 : 연결 문자열의 끝에

MultipleActiveResultSets=True 

(가정 MSSQL 2005 NLog 로그 파일에서 로깅 조각 포함 (스레드 ID는 세미 콜론 앞 번호) +)

linq 컨텍스트에 대해 이렇게하려면 다음을 수행하십시오. 속성 탭 -> 연결 확장 -> '연결 문자열'-> '고급'-> 'MultipleActiveRe' sultSets '-> 참.

오늘 제가이 문제를 해결했으며 아키텍처가 거의 동일합니다 (구조체 맵 대신 단일성 제외). JS를 통해로드되는 두 컨트롤러 포함!

+0

@DaRKoN - 감사합니다. 이것이 왜 해결책인지에 대한 설명이 있습니까? 즉 LinqToSql은 무엇을하고 있습니까? linq 쿼리가 독자를 열고 닫을 것으로 기대합니다. 연결시 독자가 열리지 않아야합니다. 동기식 데이터 호출이 없으며, 모두 단일 스레드 내에 있습니다. –

+1

내가 틀릴 수도 있지만, 의존성 삽입으로 인해 두 컨트롤러 작업이 동일한 datacontext를 공유하고 있습니다. JS는 동시에 두 가지를 동시에 요청하므로 다른 요청이 들어올 때 요청이 아직 열리는 기회가 있습니다. ID는이 문제에 대한 의견을 듣고 싶습니다. – ChadT

+0

두 경우 모두 그렇다면 놀랄 것입니다. 컨트롤러는 각각에 대해 다른 DBContext를 사용하는 객체 컨테이너에 의해 생성됩니다. 종속성이 새 인스턴스로 계단식으로 연결될 것으로 예상됩니다. 그러나 이것과 같은 캐싱은 어딘가에서 일어나는 오류가 발생해야합니다. –

2

ASP.NET MVC에서 DI 컨테이너를 사용할 때 자주 범하는 실수 중 하나는 많은 DI 컨테이너가 기본적으로 Singleton 패턴입니다. 그게 여기에 해당되는지는 모르겠지만 두 번 확인해야합니다. ASP.NET MVC는 요청 당 상태와 컨텍스트를 가지고 있기 때문에 컨트롤러가 모든 요청에서 만들어 지도록 요구합니다.

+0

감사합니다 필 필자는 요청에 따라 컨트롤러가 생성되고 있다고 말하고 싶습니다. 저는 예제에 따라 MvcContrib 컨트롤러 팩토리를 사용하고 있습니다. StructureMap의 ObjectFactory.GetInstance 메서드는 요청 된 형식의 새 인스턴스를 반환합니다. 나는 파기를 계속할 것이다! –

+0

필,이 지점을 작성해 주셔서 감사합니다. 나는 DI 컨테이너가 기본적으로 요청 당 설정되도록 설정되었다는 인상을 받았다. (나는 그것을 어딘가에 읽었다.) 그렇지 않다는 것을 알게되었다. – ChadT

+0

@Haacked Structure Map은 매번 새로운 구조로 기본 설정됩니다. mvccontrib (또는 mvc)가 인스턴스를 재사용하는지 알고 있습니까? – eglasius

1

개체 계층 구조의 어떤 것도 캐시되지 않았는지 또는 평생 설정이 있습니까? 나는 이것과 같은 설정으로 찌르다 앱을 가지고있다 :

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

asp.net MVC를 사용하고 있지 않다. 범위 지정 문제에 관해서는 아무것도 설정하지 않았다면 구조체 맵은 기본적으로 PerRequest (asp.net 요청이 아니라 각 .GetInstance 호출과 같은 구조체 맵 요청) - http://structuremap.sourceforge.net/Scoping.htm으로 기본 설정됩니다. 당신이 그것에 영향을 미칠 설정이 없다면, mvc contrib 또는 다른 것이 인스턴스를 재사용 할 수 있는지 살펴보십시오.


게시 된 예외 정보 관련 이 오류에는 조치 결과, 조치 결과 필터, json 직렬화, 사용자 정의 메소드 및 예기치 않은 널 (null)로 인해 실패한 linq2sql 호출의 조합이 포함됩니다. 그것은 여러 가지 요소의 조합입니다. 그 중 일부는 모릅니다. 나는 더 안전하게 플레이 할 것이고 linq2sql로 호출하는 계산 된 물건을 옮겨서 json serialization/action 결과 조각이 포함되지 않은 곳에 직렬화를 할 때 호출 될 것이다.이것은 내가 어떻게 언제/그 조각들이 불려지는지, 그리고 그들이 내부적으로 어떤 행동을 취하는지를 알지 못하기 때문에 당연한 일입니다.

+0

@ 프레디 - 감사합니다. 문제가 다시 발생하여 범위 문제를 찾았습니다. mvc가 사용하는 객체 빌드는 컨트롤러가 요청 될 때마다 GetInstance를 호출합니다 - 이것이 스코프와 함께 어떻게 작동합니까? 같은 컨트롤러 인스턴스를 두 번 얻을 수 있습니까? 나는 이것이 일어나고 있다고 생각한다. –

+0

@Tim 시간이 지남에 따라 예외가 게시됩니다. 또한 mvc contrib 소스를 사용하여 실행하는 것을 고려하십시오. 나는 MVC에 대한 많은 것을 알지 못한다. 나는 조금 훑어보고, 서브 콘트롤러가 이런 일을 일으킬 지 궁금해했다. – eglasius

+0

@Tim 소스를 사용하여 디버깅하고, 컨텍스트 생성자에 중단 점을 설정 한 다음 실행하여 인스턴스화되는 위치/시간을 확인합니다. – eglasius