好的,我的情况要复杂得多,但是有一种简单的复制方法。从一个全新的ASP.NET MVC 4 Web应用程序项目开始,然后选择Web API作为模板,我只是向HomeController添加了第二个mvc操作,需要在其中内部调用Web API。
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,因为我的系统是基于模块化/插件的,这使得在action方法(或其他任何方法)中重构该配置非常困难。
我建议尝试在辅助请求上重用HttpServer实例。在每个请求上创建和配置新服务器都不是预期的用途,您可能会遇到一些麻烦。要么设置DI机制,然后将HttpServer单例注入到您的控制器中,要么尝试从某个静态属性访问它。
我也建议使用new HttpClient(httpServer)
而不是HttpMessageInvoker。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句