Основываясь на комментарий Даррелл Миллера, я создал следующие :
Простой класс контейнера для хранения ссылки на «текущий» HttpRequestMessage
public class CurrentRequest
{
public HttpRequestMessage Value { get; set; }
}
обработчик сообщений, который будет хранить текущий запрос
public class CurrentRequestHandler : DelegatingHandler
{
protected async override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var scope = request.GetDependencyScope();
var currentRequest = (CurrentRequest)scope.GetService(typeof(CurrentRequest));
currentRequest.Value = request;
return await base.SendAsync(request, cancellationToken);
}
}
В Global.asax, при настройке WebAPI, добавьте обработчик сообщений.
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new CurrentRequestHandler());
Затем настроить контейнер Autofac, чтобы это построить UrlHelper
, получить текущий запрос от CurrentRequest
объекта.
var builder = new ContainerBuilder();
builder.RegisterType<CurrentRequest>().InstancePerApiRequest();
builder.Register(c => new UrlHelper(c.Resolve<CurrentRequest>().Value));
builder.RegisterType<MyService>();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
...
container = builder.Build();
UrlHelper
затем может быть введен в MyService
так же, как и любой другой зависимости.
Спасибо Даррел за то, что указали мне в правильном направлении.
Взгляните на то, что мы работаем над для WebAPIBook, то есть одно из возможных решений к этой проблеме ... https://gist.github.com/glennblock/8f18bdee15eec9c1af70 –
А, да, очень приятно. Я думал о создании обработчика сообщений, чтобы решить эту проблему. Я сделаю это. Благодарю. –