首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web照明-我如何获得HttpRequestMessage?

Web照明-我如何获得HttpRequestMessage?
EN

Stack Overflow用户
提问于 2015-04-28 11:04:44
回答 1查看 1K关注 0票数 1

在Web中使用Lightinject时,如何获得当前的HttpRequestMessage?

例如,在简单注入器中,容器上有以下扩展方法:

代码语言:javascript
复制
var msg = container.GetCurrentHttpRequestMessage() 

但我在照明弹里找不到匹配的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-28 11:27:03

如果您查看一下简单的Injector Web集成源代码,您会发现这个实现实际上是非常简单的。您可以自己轻松地实现这一点。

您需要的是创建一个自定义DelegatingHandler,它以以后可以检索的方式存储当前的HttpRequestMessage,如下所示:

代码语言:javascript
复制
public sealed class HttpRequestMessageDelegatingHandler : DelegatingHandler {
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
        CancellationToken cancellationToken) {
        CurrentMessage = request;
        return base.SendAsync(request, cancellationToken);
    }

    public static HttpRequestMessage CurrentMessage {
        get { return (HttpRequestMessage)CallContext.LogicalGetData("RequestMessage"); }
        private set { CallContext.LogicalSetData(value, "RequestMessage"); }
    }
}

// Register this handler as follows in Web API
configuration.MessageHandlers.Add(new HttpRequestMessageDelegatingHandler());

现在您可以检索请求的当前消息,如下所示:

代码语言:javascript
复制
HttpRequestMessageDelegatingHandler.CurrentMessage

Simple Injector 文档建议将此调用隐藏在自定义抽象(如简单IRequestMessageProvider )后面。当然,很容易创建一个实现:

代码语言:javascript
复制
private sealed class RequestMessageProvider : IRequestMessageProvider {
    public HttpRequestMessage CurrentMessage {
        get { return HttpRequestMessageDelegatingHandler.CurrentMessage; }
    }
}

与创建IRequestMessageProvider抽象和实现不同,您可以将其直接注册为委托,如下所示:

代码语言:javascript
复制
container.Register<Func<HttpRequestMessage>>(_ =>
    () => HttpRequestMessageDelegatingHandler.CurrentMessage);

我的首选是使用接口而不是Func<T>,因为这样的接口更加显式和可读性更强。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29917671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档