3

所以,过去几天我一直在使用 ASP.net MVC4 和新的 WebAPI。启动新应用程序时,我总是做的第一件事就是将<trust level="Medium" />其放入我的 Web.config 中,这样我就可以确定我的应用程序将在大多数主机上运行。

通常,如果我使用微软的股票,一切都没有问题。但是今晚我在关注 Brad Wilson 的Webstack of Love 演示时遇到了问题。我所有的 AJAX 调用都返回了 Server 500 错误。但是,当我直接在浏览器中点击 WebAPI 时,它会以 XML 格式返回所有内容。

所以我假设使用 WebAPI 控制器对 JSON 进行序列化是导致问题的原因。我的问题是如何解决这个问题?

让我感到困扰的是,微软教导共享主机要安全,并将事情锁定到中等信任,然后创建在中等信任中不起作用的新 Web 技术。当它是最终版本并且二进制文件安装在 GAC 中时,也许一切都会好起来的?共享主机可能需要几个月的时间才能升级到最新最好的版本。

似乎最大的问题通常是反射--90%+ 我尝试过的东西不能在中等信任上运行是由于这个原因(例如,我喜欢使用 AutoMapper 而不是手动编码 ViewModel => 实体映射)。有没有办法将反射限制在应用程序内的程序集中,以便它可以成为中等信任功能集的一部分并使这个问题成为过去?


当我发现我的 Global.asax 中甚至没有触发 Application_Error 事件时,我在 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)

链接到显示问题的示例项目。基本“测试”目录中还包含我的提琴手测试的屏幕截图:XML-fiddle.png 和 JSON-fiddle.png。

4

2 回答 2

1

Web API 在中等信任下工作得很好。此外,自 RC 版本以来,它不再部署到 GAC。您可以将 Web API dll 复制到服务器上并引用它们(或者只是从 VS 发布您的项目,或者如果您的主机支持它,则只需 git 发布它,如 Azure)。

你提到网络堆栈的爱。嗯,是 SignalR 在中等信任模式下不起作用。见这里 - 根据大卫福尔沃的说法,它不会很快https://github.com/SignalR/SignalR/issues/364

最后,如果您收到错误 500,请始终将其添加到 Global.asax

 GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

接收详细错误。

于 2012-07-29T08:14:29.487 回答
0

我的问题与具有循环关系的实体的序列化有关(在这种情况下,国家 => 国家,国家 => 国家)。JSON 序列化程序无法处理此问题,导致在请求 JSON 时出现 500 错误。

我经常直接使用实体来模拟事物并获得原型。无论如何,我总是计划使用不同的视图模型,但我想了解发生了什么以及为什么会失败。

Kiran Challa 在我的ASP.net 论坛问题中的回答帮助我解决了正在发生的错误:“RelationshipManager 对象无法序列化。当 RelationshipManager 属于不实现 IEntityWithRelationships 的实体对象时,这种类型的对象无法序列化。”

然后我在johnnycode.com 上使用 JSON.Net 和实体框架序列化循环引用

于 2012-08-06T15:53:23.360 回答