所以,过去几天我一直在玩ASP.net MVC4和新的WebAPI。我在开始使用新应用程序时首先要做的事情之一是将<trust level="Medium" />
抛入我的Web.config中,这样我就可以确定我的应用程序可以在大多数主机上运行。
通常情况下,如果我使用股票微软的东西一切正常,没有问题。但今晚我跟布拉德威尔逊Webstack of Love presentation有问题。我的所有AJAX调用都返回了Server 500错误。但是,当我直接在浏览器中点击WebAPI时,它会以XML格式返回所有内容。
所以我假设使用WebAPI控制器对JSON进行序列化是导致问题的原因。 我的问题是如何解决这个问题?
让我感到困扰的是,微软教会共享主机安全地将其锁定到Medium Trust,然后创建新的Web技术,这在Media Trust中不起作用。也许一切都会好,当它是最终版本并且二进制文件安装在GAC中时?共享主机可能需要数月才能升级到最新版本。
似乎最大的问题通常是反思 - 我尝试过的不会在Medium Trust上运行的东西的90%+是由于这个原因(例如,我喜欢使用AutoMapper而不是手工-coding ViewModel =&gt;实体映射)。有没有办法将Reflection限制在app中的程序集中,这样它就可以成为Medium Trust功能集的一部分,并使这个问题成为过去的事情?
当我发现Application_Error事件甚至没有在我的Global.asax中触发时,我在IIS上设置了失败的请求跟踪。这是抛出的异常。不知道如何获得更多细节。
Warning -MODULE_SET_RESPONSE_ERROR_STATUS
ModuleName ManagedPipelineHandler
Notification 128
HttpStatus 500
HttpReason Internal Server Error
HttpSubStatus 0
ErrorCode 0
ConfigExceptionInfo
Notification EXECUTE_REQUEST_HANDLER
ErrorCode The operation completed successfully. (0x0)
链接到sample project displaying the issue。同样包含在基础“测试”目录中的是我的小提琴测试的屏幕截图:XML-fiddle.png&amp; JSON-fiddle.png。
答案 0 :(得分:1)
Web API在中等信任方面运行良好。此外,自RC版本以来,它不再部署到GAC。您可以将Web API dll复制到服务器上并引用它们(或者只是从VS发布您的项目,或者如果您的主机支持它,则将git发布,如Azure)。
你提到了爱的网络堆栈。好吧,SignalR在中等信任模式下不起作用。看到这里 - 根据David Folwer的说法,它不会很快https://github.com/SignalR/SignalR/issues/364
最后,如果您收到错误500,请始终将其添加到Global.asax
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
接收详细错误。
答案 1 :(得分:0)
我的问题与序列化具有循环关系的实体(在本例中为Countries =&gt; States,State =&gt; Country)有关。 JSON序列化程序无法处理此问题,这在请求JSON时导致500错误。
我经常直接使用Entities进行模拟和获取原型。无论如何,我总是计划使用不同的View模型,但我想了解发生了什么以及失败的原因。
Kiran Challa在我的ASP.net forums question中的回答帮助我得到了发生的错误:“RelationshipManager对象无法序列化。当RelationshipManager属于一个实体对象时,这种类型的对象无法序列化没有实现IEntityWithRelationships。“
然后我带领我去了johnnycode.com上的Serializing Circular References with JSON.Net and Entity Framework。