return 后 ODataController 出错

ODataController erroring after return

我有一个 OData 服务,它是通过多个使用 ODataController 的 MVC 控制器实现的。除了一个控制器之外,我对所有控制器都有问题,其中 return 内部 500 错误没有任何帮助 after 我的 return 声明:

/// <summary><see cref="ODataController" /> reacting to queries relating to <see cref="Contract" /></summary>
[CustomExceptionFilter]
public class ContractsController : ODataController
{
    // GET: odata/Contracts
    [EnableQuery]
    public IQueryable<Contract> GetContracts()
    {
        return DataAccess.GetContracts();
    }

    ... other methods
}

/// <summary>Single point of reference to access data</summary>
public static class DataAccess
{
    /// <summary>Gets the queryable collection of <see cref="ContractCoverageDetail" /></summary>
    /// <returns>The queryable collection of <see cref="ContractCoverageDetail" /></returns>
    public static IQueryable<Contract> GetContracts()
    {
        IQueryable<Contract> results = null;

        using (EntityFrameworkContext context = new EntityFrameworkContext())
            results = context.Contracts.ToArray().AsQueryable();

        return results;
    }
}

另一个控制器使用相同的 DataAccess class returns 数据就好了。为每个其他控制器 returned 的所有内容是:

<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <m:code/>
    <m:message xml:lang="en-US">An error has occurred.</m:message>
</m:error>

错误似乎在 我的 return 语句之后出现,如果我在 return (F10) 之后单步执行,我会击中每个人{ 得到; } 属性 在集合的 returned 实体上,之后将带有上述错误的结果 returned 到浏览器。在我的一生中,我无法获得实际的错误信息 (innererror),奇怪的是,一个控制器在工作,而其余控制器在没有任何细节的情况下失败。

有没有人知道可能导致此问题的原因,或者如何在 return 语句之后打开错误详细信息?

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
global.asax.cs 中的

没有帮助,web.config 中的以下任何一项也没有帮助:

<system.web>
  <customErrors allowNestedErrors="true" mode="On" />
</system.web>

<system.webServer>
  <httpErrors existingResponse="PassThrough" />
</system.webServer>

知道如何处理实际引发的异常吗?

很难说出这个问题的确切原因,但您可以尝试以下几种方法。希望其中之一能为您提供有关异常的更多信息。

正在调试所有代码
这看起来很明显,但请确保您不只是调试代码。您可以通过访问 Debug -> Options and Settings... 菜单下的调试选项来检查这一点。确保未选中启用仅我的代码。通常这可能没问题。当出现异常错误并且您似乎无法找到它们时,有时此设置会使您陷入困境

调试异常
另一件既有用又痛苦的事情是 Debug -> Exceptions... 设置。这些异常集可以配置为导致 Visual Studio 自动中断,让您看到它们的活动部分。通常为了调试 MVC 和 .NET,您需要启用公共语言运行时异常。

启用调试异常后,您可能会遇到大量不想要的异常。忽略它们并保持 运行 直到出现与 oData 相关的异常。

这里是关于如何调试 Web API OData 和 ODL 库的简单指南。

http://odata.github.io/WebApi/10-01-debug-webapi-source/