【问题标题】:Web API 'in memory' requests throw exceptionWeb API“内存中”请求引发异常
【发布时间】:2015-07-16 12:38:37
【问题描述】:

好的,我的情况要复杂得多,但是有一种简单的方法可以重现。从一个全新的 ASP.NET MVC 4 Web 应用程序 项目开始并选择 Web API 作为模板,我只需将第二个 mvc 操作添加到需要在内部调用 Web API 的 HomeController。

 public async Task<string> TestAPI()
    {
        HttpServer server = new HttpServer(GlobalConfiguration.Configuration);
        using (HttpMessageInvoker messageInvoker = new HttpMessageInvoker(server, false))
        {
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:58233/api/values");
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            var response = messageInvoker.SendAsync(request, new CancellationToken()).Result;
            return await response.Content.ReadAsStringAsync();
        }

        //server.Dispose(); - if I do that on the second request I get a "Cannot access a disposed object." exception
    }

那件事只在第一个请求时有效。在随后的请求中,它会抛出

“DelegatingHandler”列表无效,因为该属性 “RequestMessageHandlerTracer”的“InnerHandler”不为空。范围 名称:处理程序

我真的需要在这里使用 GlobalConfiguration.Configuration,因为我的系统非常模块化/基于插件,这使得在操作方法(或其他任何地方)中重建该配置非常困难。

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-web-api


    【解决方案1】:

    我建议尝试在辅助请求上重新使用 HttpServer 实例。在每个请求上创建和配置新服务器不是预期的用法,您可能会遇到一些边缘情况。要么设置一个 DI 机制并将一个 HttpServer 单例注入到你的控制器中,要么尝试从某个静态属性访问它。

    我还建议使用new HttpClient(httpServer) 而不是 HttpMessageInvoker。

    【讨论】:

      【解决方案2】:

      如果您有多个 HttpServers 使用相同的配置对象,并且配置包含委托处理程序的非空列表,则 Web API 中可能会出现同样的问题。

      发生错误是因为 MVC/Web API 在第一次请求时构建处理程序管道,其中包含相互链接的所有委托处理程序(例如,RequestMessageHandlerTracer,如果启用了请求跟踪),然后是 MVC 服务器处理程序。

      如果您有多个HttpServers 使用同一个配置对象,并且配置对象包含委托处理程序,则第一个HttpServer 将成功连接到管道中;但第二个不会,因为委托处理程序已经连接 - 相反,它会在第一次请求/初始化时抛出此异常。

      此处提供有关 Web API 案例的更多详细信息(概念上相同,但使用不同的类并且修复方式略有不同): webapi batching and delegating handlers

      在我看来,MVC 配置类应该是纯配置,并且不包含实际的委托处理程序。相反,配置类应该在初始化时创建新的委托处理程序。那么这个bug就不存在了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-12
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        相关资源
        最近更新 更多