首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有相同结果集的多个odata webapi控制器

具有相同结果集的多个odata webapi控制器
EN

Stack Overflow用户
提问于 2014-11-30 17:20:03
回答 1查看 478关注 0票数 0

我需要创建两个返回相同结果集的odata控制器。

具体来说,结果集是从两个存储过程返回的,这些存储过程接收大量参数,并在服务器上执行一些繁重的处理。

两个SPs接收完全相同的参数并返回相同的数据,但是它们以不同的方式完成搜索,我需要这样做来进行一些性能测试和比较。

SPs映射到EF中的函数。

因此,我需要两个odata控制器,每个控制器调用不同的SP,但返回相同的数据类型。

我的代码如下:

控制器1

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
<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路由注册

代码语言:javascript
运行
复制
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,这不允许重新枚举集合以获得计数,然后返回实际数据。如果有人有更好的主意来处理这件事,也请告诉我。

EN

回答 1

Stack Overflow用户

发布于 2014-12-05 01:11:23

为什么你用不同的电火花加工模型映射相同的路径?你能把他们合并在一起吗?

代码语言:javascript
运行
复制
Dim builder As New ODataConventionModelBuilder
builder.EntitySet(Of SearchResult)("Search")
builder.EntitySet(Of SearchResult)("SearchV2")
config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27215975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档