我需要创建两个返回相同结果集的odata控制器。
具体来说,结果集是从两个存储过程返回的,这些存储过程接收大量参数,并在服务器上执行一些繁重的处理。
两个SPs接收完全相同的参数并返回相同的数据,但是它们以不同的方式完成搜索,我需要这样做来进行一些性能测试和比较。
SPs映射到EF中的函数。
因此,我需要两个odata控制器,每个控制器调用不同的SP,但返回相同的数据类型。
我的代码如下:
控制器1
<Authorize>
Public Class SearchController
Inherits ODataController
Private _dc As New ModelDC
' GET odata/Search
<Queryable>
Function GetSearch(<FromURI> search As SearchParam) As IQueryable(Of SearchResult)
dim result = _dc.Search(search.Parm1, search.Param2, ...).ToList
Return result.AsQueryable
end function控制器2
<Authorize>
Public Class SearchV2Controller
Inherits ODataController
Private _dc As New ModelDC
' GET odata/Search
<Queryable>
Function GetSearch(<FromURI> p1 as string, <FromURI> p2 as string, ...) As IQueryable(Of SearchResult)
dim result = _dc.SearchV2(p1, p2, ...).ToList
Return result.AsQueryable
end function和WebApiConfig.Register中的odata路由注册
Dim builder As New ODataConventionModelBuilder
builder.EntitySet(Of SearchResult)("Search")
config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel())
builder = New ODataConventionModelBuilder
builder.EntitySet(Of SearchResult)("SearchV2")
config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel())然而,当我启动应用程序时,我会得到以下错误:
“/”应用程序中的服务器错误。引发“System.OutOfMemoryException”类型的异常。描述:在执行当前web请求期间发生了未处理的异常。请查看堆栈跟踪以获得有关错误的更多信息,以及它起源于代码的位置。 异常详细信息: System.OutOfMemoryException:引发了“System.OutOfMemoryException”类型的异常。 源错误: 在执行当前web请求期间生成一个未处理的异常。有关异常的起源和位置的信息可以使用下面的异常堆栈跟踪来标识。 堆栈跟踪: OutOfMemoryException:抛出了“System.OutOfMemoryException”类型的异常。System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName,String codeBase,String,RuntimeAssembly locationHint,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,布尔throwOnFileNotFound,布尔forIntrospection,布尔suppressSecurityChecks) +0 System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName,String codeBase,String,RuntimeAssembly locationHint,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,Boolean,Boolean,Boolean ) +34 System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,Boolean,RuntimeAssembly reqAssembly,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,Boolean,Boolean,Boolean) +152 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString,assemblySecurity,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,Boolean ) +77 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString,StackCrawlMark,StackCrawlMark& stackMark,Boolean ) +16 System.Reflection.Assembly.Load(String assemblyString) +28 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName (布尔型starDirective) +38 ConfigurationErrorsException:抛出了“System.OutOfMemoryException”类型的异常。 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName (布尔型starDirective) +736 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +217 System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +130 System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +170 System.Web.Compilation.BuildManager.GetPreStartInitMethodsFromReferencedAssemblies() +91 System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath,布尔& isRefAssemblyLoaded) +284 System.Web.Compilation.BuildManager.ExecutePreAppStart() +153 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager,IApplicationHost appHost,IConfigMapPathFactory configMapPathFactory,HostingEnvironmentParameters hostingParameters,PolicyLevel policyLevel,Exception appDomainCreationException) +521 HttpException (0x80004005):引发了“System.OutOfMemoryException”类型的异常。 +9930508 System.Web.HttpRuntime.FirstRequestInit(HttpContext上下文(+9930508 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext上下文)+101个System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr,HttpContext上下文) +254
有什么问题吗?这是因为两个控制器都是用相同的返回类型定义的吗?当然,我可以为第二个SP创建一个不同的实体(具有完全相同的结构),并将每个SP的结果映射到不同的结果类,并且我假设这会工作,但我希望它们都返回相同类型的结果。
我做错了什么?
谢谢
PS。我先将结果转换为ToList,然后返回AsQueryable,因为我需要支持$inlinecount odata param,而EF映射的SPs在内部使用DataReader,这不允许重新枚举集合以获得计数,然后返回实际数据。如果有人有更好的主意来处理这件事,也请告诉我。
发布于 2014-12-05 01:11:23
为什么你用不同的电火花加工模型映射相同的路径?你能把他们合并在一起吗?
Dim builder As New ODataConventionModelBuilder
builder.EntitySet(Of SearchResult)("Search")
builder.EntitySet(Of SearchResult)("SearchV2")
config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel())https://stackoverflow.com/questions/27215975
复制相似问题