簡體   English   中英

HttpRequestMessage未在Web API服務的內存托管中在Autofac中注冊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM