![](/img/trans.png)
[英]Programmatically send an HttpRequestMessage to the Web API pipeline without Hosting
[英]HttpRequestMessage not registered in Autofac with in memory hosting of Web API service
我试图使用内存托管为ASP.Net Web API服务创建集成测试。 我们正在使用Autofac作为我们的DI工具。
服务中的部分逻辑需要HttpRequestMessage。 在内存中方案中,该对象未注册,但在IIS托管中。
测试设置:
var builder = new ContainerBuilder();
var config = GlobalConfiguration.Configuration;
builder.RegisterHttpRequestMessage(config);
builder.RegisterWebApiFilterProvider(config);
var configurator = new AutofacConfigurator();
configurator.Configure(builder); // this does the individual registrations
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
var controller = typeof(DocumentController);
var config = new HttpConfiguration();
config.Routes.MapHttpRoute("DefaultApi", "v1/{controller}/search/{id}", new { id = RouteParameter.Optional });
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
var resolver = new AutofacWebApiDependencyResolver(container);
var server = new HttpServer(config);
server.Configuration.DependencyResolver = resolver;
var messageInvoker = new HttpMessageInvoker(new InMemoryHttpContentSerializationHandler(server));
var search = new SearchModel {
// ... snip ...
};
HttpMessageInvoker messageInvoker = ConfigureServer();
HttpRequestMessage request = ConfigureRequest(search);
using (HttpResponseMessage response = messageInvoker.SendAsync(request, new CancellationTokenSource().Token).Result)
{
var responseBodyAsText = response.Content.ReadAsStringAsync();
var result = response.Content.ReadAsAsync<ApplicationSearchResult>();
var parsed = result.Result;
Assert.IsTrue(result.Result.Messages.Any(r => r.Equals("...", StringComparison.OrdinalIgnoreCase)));
}
ConfigureRequest方法:
private static HttpRequestMessage ConfigureRequest(SearchModel search)
{
string baseAddress = "http://dummyname/";
HttpRequestMessage request = new HttpRequestMessage();
request.Content = new ObjectContent<SearchModel>(search, new JsonMediaTypeFormatter());
request.RequestUri = new Uri(baseAddress + "v1/Document/search");
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", Initialization.oauthToken);
request.Method = HttpMethod.Post;
return request;
}
尝试使用HttpRequestMessage(来自AutofacConfigurator):
container.Register(x =>
{
if (x.IsRegistered<HttpRequestMessage>()) // false for in memory, true for IIS
{
var httpRequestMethod = x.Resolve<HttpRequestMessage>();
var tokenHelper = x.Resolve<ITokenHelper>();
var token = tokenHelper.GetToken(httpRequestMethod);
var connectionContext = x.Resolve<ISqlServerConnectionContext>();
connectionContext.Token = token;
return token ?? new NullMinimalSecurityToken();
}
return new NullMinimalSecurityToken();
}).As<IMinimalSecurityToken>().InstancePerApiRequest();
有什么方法可以在内存中注册HttpRequestMessage?
因此,解决方案很容易(非常容易)。 在测试中创建HttpRequestMessage之后,将其注册到容器中:
var newBuilder = new ContainerBuilder();
newBuilder.Register(c => request).As<HttpRequestMessage>();
newBuilder.Update(_container);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.