使用温莎城堡解析 HttpControllerContext

2024-03-23

In the ASP.NET Web API http://www.asp.net/web-api,HttpControllerContext实例提供了很多有关当前环境的信息,包括当前请求的URI。

如果服务依赖于此类信息(例如请求 URI),则应该可以将该信息注入到服务中。

使用 Poor Man 的 DI 可以很容易地做到这一点:只需实现自定义 IHttpControllerActivator http://blog.ploeh.dk/2012/04/17/InjectingHttpControllerContextWithTheASPNETWebAPI.aspx.

然而,有了温莎城堡,这突然变得非常困难。之前,我已经描述了一种非常复杂的方式 http://blog.ploeh.dk/2012/04/19/WiringHttpControllerContextWithCastleWindsor.aspx解决这个问题,但这取决于 PerWebRequest 生活方式,事实证明这种生活方式在自托管场景中不起作用,因为 HttpContext.Current 是空的。

到目前为止,我已经能够通过将所需信息作为内联参数从自定义 IHttpControllerActivator 传递给 Resolve 方法来完成这项工作:

public IHttpController Create(
    HttpControllerContext controllerContext,
    Type controllerType)
{
    var baseUri = new Uri(
        controllerContext
            .Request
            .RequestUri
            .GetLeftPart(UriPartial.Authority));

    return (IHttpController)this.container.Resolve(
        controllerType,
        new { baseUri = baseUri });
}

但是,默认情况下,只有当立即请求的类型依赖于参数时(即,如果请求的控制器本身依赖于参数),这才有效。baseUri)。如果依赖于baseUri埋藏在依赖层次结构的更深处,默认情况下它不起作用,因为内联参数不会传播到更深的层。

可以使用自定义 IDependencyResolver(Castle Windsor IDependencyResolver,而不是 ASP.NET Web API IDependencyResolver)更改此行为:

public class InlineDependenciesPropagatingDependencyResolver :
    DefaultDependencyResolver
{
    protected override CreationContext RebuildContextForParameter(
        CreationContext current, Type parameterType)
    {
        if (parameterType.ContainsGenericParameters)
        {
            return current;
        }

        return new CreationContext(parameterType, current, true);
    }
}

请注意true正在被传递为propagateInlineDependencies构造函数参数而不是false,这是默认实现。

为了将容器实例与 InlineDependencyPropagatingDependencyResolver 类连接起来,必须按以下方式构造它:

this.container = 
    new WindsorContainer(
        new DefaultKernel(
            new InlineDependenciesPropagatingDependencyResolver(),
            new DefaultProxyFactory()),
        new DefaultComponentInstaller());

我想知道这是否是解决这个问题的最佳方法,或者是否有更好/更简单的方法?


为了完整起见,我在 Twitter 上从 Krzysztof Koźmic(温莎城堡的现任维护者)那里得到的答案表明,问题中概述的方法确实是实现这一特定目标的正确方法。

(但是,我无法链接到该推文,因为克日什托夫的推特帐户受到保护(推文不公开可见。))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用温莎城堡解析 HttpControllerContext 的相关文章

  • 在 ASP.NET 自托管 Web API 上配置 SSL

    我正在创建自托管 Web API 服务 为了确保它的安全 我研究并实施了this http www codeproject com Articles 630986 Cross Platform Authentication With ASP
  • 有 PayPal IPN 的示例吗

    我有一个 Asp Net WEB API 2 项目 我想实现一个即时付款通知 IPN 侦听器控制器 我找不到任何示例和 nuget 包 我所需要的只是确认用户使用 Paypal 上的标准 html 按钮付款 这很简单 所有 nuget 包都
  • Web API 获取多部分/表单数据响应的最简单方法

    我有问题 但我看不到我做错了什么 我想用最简单的方法来让它工作 稍后我会让它变得更复杂 但目前只想命中 post 方法 我什至不关心里面的代码当前是否正在工作 我唯一关心的是它会发回 OK 200 回复 目前 我要么收到内部服务器错误 50
  • 跨程序集和命名空间的依赖注入

    我正在解决一个 DI 问题 我认为我了解其原因 但我需要一些建议来解决 我构建了一个与 Sql 对话的独立程序集 将此程序集称为 a 以及另一个包含业务逻辑的程序集 将此程序集称为 b 我在 b 程序集中为 db 类创建了一个接口 由于该接
  • 窗口依赖注入

    我想在 WPF 应用程序中使用 Unity 依赖注入 我的窗口抛出 System Windows Markup XamlParseException 对于 MainWindow 类型 没有找到默认构造函数 这是我的代码 应用程序 xaml
  • 在 MVC 中使用 DI 时的大量控制器构造函数参数列表

    我正在开发 ASP NET MVC3 解决方案 该解决方案使用 autofac 的依赖注入 我们的控制器由 autofac 正确创建 所有必需的对象都正确传入 这些对象通常包括服务 存储库和将域对象转换为 MVC 视图 模型的映射器 所以控
  • ASP NET Web API 路由模板

    我有一个名为 Agency 的实体 具有以下 api GET http localhost 37331 api agency start 1 limit 10 status 1 GET http localhost 37331 api ag
  • 如何检测Web Api Post请求Json中的重复键

    当请求 Json 包含重复键时 我需要从 ASP NET Web API Post 请求返回 400 错误 例如 如果请求是 key1 value1 key2 1000 key2 2000 key3 value3 那么我希望由于有两个 ke
  • APIController“执行”方法?

    In an ApiController操作 我需要在操作完成执行后立即关闭与数据库的连接 在控制器下我重写OnActionExecuted来实现这一目标 我将如何在ApiController action Thanks 你可以覆盖Execu
  • WebAPI 请求格式的异常

    在项目中使用RC版本的MVC4 WebAPI 我在API服务器端不断遇到以下错误 System FormatException The format of value application json charset utf 8 is in
  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • Symfony 4.1 组件 - 依赖注入问题

    我正在用 PHP 重构旧应用程序 我正在尝试使用 Symfony 依赖注入组件将服务注入控制器 或其他服务 但我不知道如何实现这一点 因为 symphony 文档比框架组件更适合使用框架 我已经有了自己的内核 包含所有服务和控制器的容器 控
  • “@inject”-ed 属性保持为空

    我试图将服务注入到我的 bean 中 但它总是null 我收到以下错误 WELD 001000 根据基本 null 解析属性 userBean 时出错 一些代码片段 索引 xhtml
  • HTTP 403 Forbidden:访问被拒绝 ASP.NET Web API

    在生产服务器上运行 ASP NET Web API 项目时 我收到以下错误 403 禁止 访问被拒绝 您没有权限查看 使用您提供的凭据访问此目录或页面 查看 IIS 7 0 错误日志 基本错误是 403 14 目录列表被拒绝 我已经配置了生
  • 如何在依赖注入之外构造对象?

    我有很多使用依赖注入来注入对象集合的服务 如下所示 IRepository
  • Dockerize 一个网络核心 Web api

    我正在尝试对 aspnetcore webapi 进行 dockerize 我按照这里的教程进行操作 https docs docker com engine examples dotnetcore https docs docker co
  • ApiController 操作无法从查询字符串解析数组

    使用 Visual Studio 2012 2 MVC4 Web 应用程序 我有请求发送到我的 ApiController 如下所示 http localhost api keys ids 1 ids 2 ids 3 我的印象是以下方法应该
  • 允许 .NET WebApi 忽略 DOCTYPE 声明

    我正在尝试通过 WebApi 方法将 XML 反序列化为对象 我有以下课程 XmlRoot IsNullable false public class MyObject XmlElement Name public string Name
  • MVC和依赖注入,被迫使用单例Controller?

    我正在致力于构建一个根据 MVC 原则运行并利用依赖注入的 PHP 框架 我想我已经把前端控制器部分放下了 有一个工作路由器实例化控制器实例并根据请求的 URI 调用适当的操作 接下来是依赖注入 我想实现一个使用反射解决依赖关系的容器 这样
  • 使用并非为 IOC 设计的遗留应用程序避免服务定位器反模式

    我经常读到IOC 中的服务定位器是一种反模式 http blog ploeh dk 2010 02 03 ServiceLocatorIsAnAntiPattern aspx 去年 我们在工作中的应用程序中引入了 IOC 具体来说是 Nin

随机推荐

  • 从 C# 调用 PowerShell cmdlet 会抛出 CommandNotFoundException

    我正在尝试致电Add AppxPackage来自 C 的 cmdlet 我找到了 MSDN 文章从 C 代码运行 PowerShell http msdn microsoft com en us library dd182449 28v v
  • axios catch 没有捕获错误

    我在用着axios 0 17 0使用以下代码 this props userSignupRequest this state then res gt console log res data catch err gt this setSta
  • Mathematica 8 中函数声明的问题

    这是一个奇怪的结果 在此示例中函数定义为 functionB 有人可以解释一下吗 我想绘制functionB x and functionB Sqrt x 它们一定是不同的 但是这段代码表明functionB x functionB Sqr
  • 如何获得从一种颜色到另一种颜色的中间颜色? [复制]

    这个问题在这里已经有答案了 可能的重复 两种颜色之间的android颜色 基于百分比 https stackoverflow com questions 4414673 android color between two colors ba
  • 如何在 SQLite 中比较两个日期?

    我有点假设它是一个字符串 所以我将它作为一个字符串进行比较 但毫不奇怪它失败了 我相信这就是 Mysql 的工作原理 我可能是错的 因为我已经有一段时间没有工作了 无论哪种情况 如何检查 SQLite 中的日期是否相等 我将在 WHERE
  • Alamofire - 未进行代码签名,因为其设置未指定 Xcode 8 中的开发团队

    我在 Xcode 8 上遇到了下面的错误 大家能帮忙解决一下吗 我的应用程序需要支持iOS 8及以上版本 Alamofire 不会进行代码签名 因为其设置未指定开发团队 对于使用 Swift 的目标 需要正确配置 使用旧版 Swift 语言
  • 使用进程c#进行错误处理

    我使用 C 创建了一个控制台应用程序 并使用以下命令从另一个 Windows 窗体应用程序调用它Process 下面是我的控制台应用程序代码 static void Main string args try my code catch Ex
  • JDBCRealm 和 DataSourceRealm 有什么区别? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我读到了这样的评论 根本不要使用 JDBCRealm 它根本无法扩展 因为有一个 JDBC Connection 对象用于所有数据库通
  • python和谷歌云存储

    我找不到如何使用谷歌云存储而不在谷歌应用程序引擎上运行它的示例 我想要这样的东西 这对我很有用 https github com GoogleCloudPlatform storage getting started javascript
  • JQuery 更改在模糊之前不会触发

    我使用change handler 来监听textarea的更改事件 但我只在textarea失去焦点时收到事件 但我想在值更改时立即收到事件 text object change listener function listener do
  • 避免在自定义交叉过滤器归约函数中进行多次求和

    这个问题是由于创建过程中遇到的一些困难而产生的crossfilter数据集 特别是如何对不同维度进行分组并计算派生值 最终目标是拥有一批dc js使用维度和组的图表 小提琴示例https jsfiddle net raino01r 0vjt
  • 用户日期时间设置为 GMT,如何将日期转换为其本地化设置?

    在我的用户设置中 我有一个下拉菜单 其中包含所有 GMT 日期供用户选择 在 C 中 如何将数据库中存储的日期时间转换为 GMT 时间 数据库中存储的时间为服务器时间 对于 NET 3 5 您可以将系统时区标识符与用户一起存储 您可以从Ti
  • 浏览器如何处理高度和宽度的非整数值?

    当浏览器给出的元素的宽度和高度不是整数值时 它们如何处理它们 尤其 非整数值在什么阶段进行四舍五入 它们是四舍五入到最接近的整数 还是截断它们 当容器的子元素具有非整数尺寸时 是否会出现子元素长度或高度之和不等于父元素的内部宽度 高度的情况
  • 显示 UILabel * 秒;除了 NSTimer 之外还有其他方法吗?

    是否有其他方式显示对象 按钮 其他内容 例如 3 秒而不是 NSTimer 我可以使用动画来做到这一点吗 您可以使用 performSelector withObject afterDelay 尽管它内部使用了一个计时器 theLabel
  • 获取 NSTextField 内容以缩放

    我怎样才能让文本比例适合我给它的边界 我过去也做过类似的事情 void calcFontSizeToFitRect NSRect r float targetWidth r size width xMargin float targetHe
  • C++ 按升序打印文件名

    我正在使用以下代码来迭代目录中的文件 该目录中的所有文件都有编号 每个文件都有唯一的编号 下面的代码成功打印出目录中的所有文件 但不是按升序排列 它完全随机出现 并且有一个文件是重复的 我找不到另一种打印文件或按升序打印文件的方法 我确实需
  • C# Xamarin Forms - 执行任务,超时

    和其他许多人一样 我需要编写一个返回任务的函数 并且我希望该任务在一段时间后自动超时 初始代码如下所示 class MyClass TaskCompletionSource
  • 按 nginx 中的位置提供 pdf 文件

    我如何提供文件 webapps app static downloads privacy policy pdf 按地址 https my site net privacy 我尝试在 nginx 中使用位置 但这不起作用 location p
  • Dropwizard ExceptionMapper:验证原始标头字段

    有谁知道如何从请求中获取原始标头字段 我想验证客户端是否会收到 html 或只是纯 文本响应 我可以在异常映射器的 toResponse 方法中获取此字段吗 我像这篇文章中一样创建了异常映射器 http gary rowe com agil
  • 使用温莎城堡解析 HttpControllerContext

    In the ASP NET Web API http www asp net web api HttpControllerContext实例提供了很多有关当前环境的信息 包括当前请求的URI 如果服务依赖于此类信息 例如请求 URI 则应