简体   繁体   中英

HttpRequestMessage not registered in Autofac with in memory hosting of Web API service

I am trying to create integration tests for my ASP.Net Web API service, using in memory hosting. We are using Autofac as our DI tool.

Part of the logic in the service requires the HttpRequestMessage. In the in memory scenario that object is not registered, but it is in IIS hosting.

Test set up:

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 method:

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;
}

Attempting to make use of HttpRequestMessage (from 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();

Is there some way to register the HttpRequestMessage in the in memory scenario?

So the solution turned out to be easy (suspiciously easy). After I create my HttpRequestMessage in the test, I register it in the container:

var newBuilder = new ContainerBuilder();
newBuilder.Register(c => request).As<HttpRequestMessage>();

newBuilder.Update(_container);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM