在 Web API 应用程序中,我可以在什么时候拦截 URI 参数并相应地路由调用?

2024-04-08

注:这个问题确实有点类似于this one https://stackoverflow.com/questions/21388655/can-i-programmatically-determine-the-database-context-to-use-based-on-user-cre,但我想我可以用更简单、更具体的方式来表达。

我使用 Castle Windsor 拦截传递给我的 Web API 应用程序的 URI,以将适当的具体类注册到控制器的构造函数。

我想要做的是在 URI 上传递一个“站点编号”,也许始终作为第一个或最后一个参数。 IOW,对于站点 42,而不是

http://localhost:28642/api/platypi/GetAll

...这将是:

http://localhost:28642/api/platypi/42/GetAll

-or:

http://localhost:28642/api/platypi/GetAll/42

当我的 Web API 应用程序第一次“看到”/拦截 URI 时,我想记下该站点编号,以便我可以分配所需的具体存储库以由温莎城堡注册。我希望能够做到这一点:

public class RepositoriesInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        if (siteNum == 42)
        {
            container.Register(
            Component.For<IDepartmentRepository>().ImplementedBy<DepartmentRepository42>().LifestylePerWebRequest(),
                Component.For<IInventoryItemRepository>().ImplementedBy<InventoryItemRepository42>().LifestylePerWebRequest(),
            . . .
        }
        else if (siteNum = 77)
        {
            container.Register(
        Component.For<IDepartmentRepository>().ImplementedBy<DepartmentRepository77>().LifestylePerWebRequest(),
                Component.For<IInventoryItemRepository>().ImplementedBy<InventoryItemRepository77>().LifestylePerWebRequest(),
            . . .
        }

通过这种方式,我可以为站点 42 提供其数据,为站点 77 提供其数据(每个站点使用共享公共架构的不同数据库)。

那么:在我的 Web API 应用程序生命周期中的哪个时刻,我可以劫持 URI,以便将适当的 val 分配给全局 siteNum 变量,以便在 IWindsorInstaller 方法运行之前就已分配该变量?

UPDATE

感谢 Slate 先生,但如果我这样做,这个控制器代码会是:

public DepartmentsController(IDepartmentRepository deptsRepository)
{
    if (deptsRepository == null)
    {
        throw new ArgumentNullException("deptsRepository");
    }
    _deptsRepository = deptsRepository;
}

...变得:

public DepartmentsController(IDepartmentRepository deptsRepository)
{
    if (deptsRepository == null)
    {
        throw new ArgumentNullException("deptsRepository");
    }
    _deptsRepository = deptsRepository(siteNum);
}

...or???

我仍然面临一个问题,即在 Castle Windsor / 控制器获取传入的 URI 之前,我应该在哪里拦截它,以便我可以为 global / siteNum var 设置适当的值?


您可以使用许多扩展点来实现这一目标,我个人使用这个扩展点来获得类似的结果。

通过扩展创建自定义模型绑定器IModelBinder像这样的东西:

public class SiteManagerModelBinder : IModelBinder
    {
        #region IModelBinder Members

        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            if (bindingContext.Model != null)
            {
                throw new InvalidOperationException("Cannot update instances");
            }

            // Apply your condition to determine if site number is in Url.
            if (controllerContext.RouteData.Values['siteNum']!=null)
            {
               // probably want to resolve this from container just hard coding as example, assumption is that SiteManager, does the repository bits for you.
               return new SiteManager((int)controllerContext.RouteData.Values['siteNum']);
            }

            return null;
        }

        #endregion
    }

好的,现在我们只需要注册新的 ModelBinder:

    protected void Application_Start()
    { 
        ModelBinders.Binders.Add(typeof(SiteManager), new SiteManagerModelBinder ());

好的,现在在我们的控制器中,我们所做的就是添加 SiteManager 作为任何 Action 的参数,它将由我们的 ModelBinder 填充。

public class DepartmentsController: Controller {

    public ActionResult AnyAction(SiteManager siteManager, int whateverElse, ViewModel model)
    {

    }

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

在 Web API 应用程序中,我可以在什么时候拦截 URI 参数并相应地路由调用? 的相关文章

  • 如何在线程中调用带有多个参数的方法?

    我正在构建一个 C 桌面应用程序 如何在线程中调用采用多个参数的方法 我有一个名为 Send string arg1 string arg2 string arg3 的方法 我需要使用名为 SendingThread 的线程调用此方法 有人
  • 原子地从 ConcurrentQueue 中获取所有内容

    我有多个线程生成项目并将它们粘贴在一个公共的ConcurrentQueue private ConcurrentQueue
  • 迭代 C++ 映射中的键

    有没有办法迭代键 而不是 C 映射对 地图是关联容器 因此 迭代器是一对key val 如果您只需要键 则可以忽略该对中的值部分 for std map
  • 如果 POSIX 系统上不存在目录,是否有办法自动创建该目录?

    POSIX 系统上是否有任何方法可以仅在目录尚不存在时才自动创建该目录 如同 int fd open path to file O CREAT O EXCL O RDWR 0644 这不起作用 int dfd open path to di
  • 如何在WPF中使用Application.Exit事件?

    我需要删除一些特定文件 然后用户关闭 WPF 中的程序 所以我从这里尝试了 MDSN 代码http msdn microsoft com en us library system windows application exit aspx
  • csharp类可以像java类一样“继承”xml文档吗?

    我正在向一些csharp代码添加注释 并且我正在使用 net 或其他东西 提供的xml语言 我有一个接口和一些实现类 我在界面中有一个方法 它有一个注释 在实现类中没有对实现方法进行注释 当人们在java中这样做时 javadoc在生成文档
  • pthread_join() 中的阻塞

    根据手册页 pthread join 函数应暂停调用的执行 线程直到目标线程终止 除非目标线程 已经终止了 因此 据我了解 调用进程将阻塞 直到指定的线程退出 现在考虑以下代码 pthread t thrs NUMTHREADS for i
  • 如何将 C# 6 与网站项目类型一起使用?

    更新了现有的Web Site项目类型Visual Studio 2015 我将Framework更改为4 6 然后我希望在我的代码隐藏文件中可以使用所有这些新功能 不幸的是我收到如下错误 错误 CS8026 功能 表达式主体属性 在 C 5
  • std::线程构造和执行

    我在 中找不到任何信息文档 http en cppreference com w cpp thread thread thread是否能保证线程对象构造完成后线程实际上正在运行 换句话说 是否可以保证线程构造函数完成后线程函数已经被执行 一
  • 如何在字符串中写入反斜杠 (\)?

    我想写这样的东西C Users UserName Documents Tasks in a textbox txtPath Text Environment GetFolderPath Environment SpecialFolder M
  • 使用枚举作为常量表达式。哪个编译器是正确的?

    以下代码使用枚举成员m作为常量表达式 即作为模板参数 该代码可以在 gcc 下编译 但不能在 clang 下编译 现场演示 http coliru stacked crooked com a 79f0d052864fec19 20live
  • C# 中的时间跨度总和

    我有一个包含 TimeSpan 变量的对象集合 MyObject TimeSpan TheDuration get set 我想使用 LINQ 来计算这些时间的总和 当然 从 MyCollection 中的 r 选择 r TheDurati
  • 访问 ASP.NET 中 App_Code 中未声明的类

    我有时定义业务逻辑类来 帮助 我的 ASPX 代码隐藏类 对我来说 将它们都包含在代码隐藏文件中是最有意义的 因为它们一起工作 但是 我偶尔想从 App Code 中定义的更高级别的类访问业务逻辑类 但它们不能在文件外部自动访问 因此 问题
  • 开源 C# 套接字 (TCP + UDP) 库 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对 NET 框架的标准套接字类感到头疼 有人可以推荐一个高效的开源 C 套接字 TCP UDP 库来处理套接字消息吗 使用 Kerry Jia
  • 使用 Regex/C# 将 转换为

    奇怪的问题 但我不会浪费时间解释为什么我需要这样做 只是我需要这样做 我有以下内容
  • 起订量中的匹配设置问题

    我过去一周左右一直在使用 Moq 直到今天才遇到任何问题 我在获取时遇到问题VerifyAll 以正确匹配我的模拟的设置 我目前正在为我的应用程序的 API 编写单元测试 该应用程序的结构如下 API lt gt Service lt gt
  • 布局兼容类型的联合

    看这段代码 struct A short s int i struct B short s int i union U A a B b int fn U u u a i 1 return u b i 是否保证fn 回报1 注意 这是一个后续
  • 模板编译错误 - 没有匹配的调用函数

    我正在尝试将字符串转换为数字 为此 我找到了以下方法 include
  • 是否可以从C语言函数写入word文件?

    我有一个用 C 语言编写的图书馆管理系统 其中有 I O 文件 dat 如何从该函数中获取word文件的输出 void viewbooks void show the list of book persists in library int
  • 用户已拥有超过“max_user_connections”个活动连接 HANGFIRE

    我明白 用户已拥有超过 max user connections 个活动连接 已经有很多答案了 但这是关于Hangfire的 我在用Hangfire http docs hangfire io en latest background pr

随机推荐

  • 如何在 javascript 中发送 SOAP 请求,就像在 SoapUI 中一样

    我目前正在开发一个 NodeJS 项目 我需要使用一些soap xml wsdl 问题是无法弄清楚其中任何一个是如何工作的 所以请原谅我的无知 这是我需要的 我有一个 WSDL 站点 我需要从中获取一些答案 我已经弄清楚如何在 SoapUI
  • 使用自定义操作卸载多个产品

    我正在为我们的产品开发基于 WIX 的安装程序 该产品有一个基础产品和许多插件 基础版和插件将作为单独的 MSI 提供 仅当底座可用时才能安装插件 基础和插件在根文件夹下共享公共文件夹树 例如 C Program files MyProdu
  • 当鼠标离开父级时,为什么 IE 8 会因引导、淘汰验证和自定义绑定处理程序而崩溃?

    好吧 这是一个疯狂的错误 我和同事无法弄清楚 Internet Explorer 8 崩溃 没有控制台错误消息 当使用具有自定义绑定 数据绑定 的无线电输入更改淘汰可观察值并且您移出父 DOM 容器时 就会发生这种情况 在 IE 8 浏览器
  • Roxy Fileman 与 TinyMCE 5 使用 file_picker_callback

    我试图upgradeTinyMCE 版本 4 起to ver 5 但函数 file browser callback 已被替换为文件选择器回调具有完全不同的参数 TinyMCE v 4 file browser callback funct
  • 无法创建使用文字零的通用函数

    我正在尝试编写一个与内置函数类似的 Rust 函数Range 但我想要的东西只会返回 X 个数字 并将其作为列表返回 这就是我尝试创建此函数的原因 外部板条箱编号 use num Integer fn positions
  • 将 JSF 应用程序迁移到 Weblogic 12

    我们开发了一个基于 Seam 2 的 Java EE 5 应用程序 它在 Weblogic 11g 上运行 现在 我尝试按照与之前的 WLS 相同的步骤将相同的 WAR 文件部署到新的 Weblogic 12c 本地 Windows 7 计
  • 如何使 Excel MIN 函数忽略集合中的零?

    在 Excel 中 我有以下公式 MIN H69 H52 H35 H18 1 H18 10应该返回MIN范围 并将其除以当前单元格 1 H18 然后乘以 10 我在添加 NULLIF 语句类型时遇到困难 我希望能够有 可能 空白行 并让 M
  • 如何使用 PHP 将 JSON 解析为 html 表?

    我必须在我的网站上找到一张桌子 并且必须从以下位置获取该表的数据 我已经尝试了很多东西但没有任何作用
  • 在 C# 中实现接口与显式实现接口 [重复]

    这个问题在这里已经有答案了 我在 VS2010 中有两个用于实现接口的选项 当我有 IHelper cs 界面如下 public interface IHelper IEnumerable
  • 无法加载 python gstreamer 元素

    我正在跟随指南https mathieuduponchelle github io 2018 02 01 Python Elements html gi language undefined https mathieuduponchelle
  • Xcode:内存使用情况比较

    在 xcode 中模拟 iOS 时 丢失 3 4 的内存给 其他进程 正常吗 是的 这是正常的 其他进程 实际上包括 Mac 上当前运行的所有其他程序 这个数字与模拟器无关 它不测量模拟器中运行的进程 如果您运行 iOS Simulator
  • 使用地理编码将多个 addListener 事件添加到 Google 地图表单

    我创建了一个 Google 地图表单 允许用户在文本字段中输入地址并对条目进行地理编码 然后这会在地图上放置一个标记 这工作正常 但我想添加一个额外的 addListener 这样当用户单击地图时 它将在他们单击的位置添加另一个图钉 由于某
  • 完整更新 pip 包时出错

    当 pip 使用命令更新所有包时 pip freeze local grep v e cut d f 1 xargs pip install U 点打印错误vboxapi Downloading unpacking vboxapi Coul
  • NativeScript radlist 视图按需加载的工作原理

    这可能不是问题 但这是从头开始学习本机脚本时出现的一系列疑问 我有一个 1000 或更多的数据列表存储在数据表中 知道我想将其显示在列表视图上 但我不想立即读取所有数据 因为我有图像存储在其他目录中并且也想读取它 因此 对于 20 到 30
  • 获取过滤值的对象键

    情况很简单 我有一个以下对象 Object 1 false 2 true 3 false 4 false 5 false 6 false 7 false 8 true 12 false 13 false 14 false 15 false
  • .NET 日期时间.Parse

    当尝试使用解析方法时DateTime类中 我抛出异常 字符串未被识别为有效的日期时间 该字符串读作 26 10 2009 8 47 39 AM 输出时 该字符串是从正则表达式的匹配组中获取的 从该匹配组获得的任何字符串都不会解析为日期时间
  • 如何在 ASP.NET 中将对象保存到会话并在视图中访问它

    我正在编写 Asp Net MVC 4 应用程序 我想将模型对象保存到会话中 然后从另一个页面访问它 但不知道该怎么做 是否可以 例如一些代码 HttpPost public ActionResult Index EventDetails
  • 通过网络登录从 Windows 服务创建 GUI

    我读了很多关于从 Windows 服务执行 GUI 应用程序的文章 当服务以系统用户身份运行时 我使用的是 Windows XP 允许服务与桌面交互 复选框对我有用 现在我需要该服务作为域中定义的用户 来自网络 运行 一切工作正常 即使没有
  • 在 Safari/WebView 中禁用 XSS 过滤器

    我正在开发一个用于 XSS 检查的工具 使用 Webkit WebView 和 Macruby 这非常有效 只是 Safari 的 XSS 过滤器偶尔会捕获我的 URL 并拒绝执行恶意脚本 有没有办法禁用此功能 最好以编程方式禁用 经过一番
  • 在 Web API 应用程序中,我可以在什么时候拦截 URI 参数并相应地路由调用?

    注 这个问题确实有点类似于this one https stackoverflow com questions 21388655 can i programmatically determine the database context t