【问题标题】:Dynamically changing config file for Web API does not find service endpoint动态更改 Web API 的配置文件未找到服务端点
【发布时间】:2014-07-23 14:50:07
【问题描述】:

我正在尝试交换配置文件进出我的 web api 以与不同的 WCF web 服务进行交互。我在以下链接中找到了在运行时更改我的 webconfig 文件的解决方案。

Config Swapper Class

当从命令行应用程序调用替换我的新配置文件时,这很有效,但是当我从我的 API 调用配置文件更改器时,我得到以下错误。

“在 ServiceModel 客户端配置部分中找不到引用合约‘OldDominionWebServices.RateDelegate’的默认端点元素。这可能是因为找不到您的应用程序的配置文件,或者因为找不到与此合约匹配的端点元素客户端元素。”

这是我试图引用的端点

<endpoint address="https://www.odfl.com:443/wsRate_v4/RateService" binding="basicHttpBinding" bindingConfiguration="RatePortBinding" contract="OldDominionWebServices.RateDelegate" name="OldDominionWebServices" />

我知道错误的含义,但不确定为什么会在交换了配置文件的 Web api 中抛出此错误,但在使用执行相同操作的控制台应用程序时不会抛出此错误。在命令行应用程序的情况下,使用此 Web 服务的程序集被引用为解决方案的一部分,其中与 api 一样,程序集是通过反射加载的。我已经看到一些建议,我需要在端点的合同中使用完全限定域名,但这仍然会导致相同的错误。

我希望这是我忽略的一些简单的事情,在此先感谢!

【问题讨论】:

  • 所以你想从你的 Web API 代码中交换配置文件?
  • 没错,在程序集调用期间,配置文件被替换为程序集特定的配置文件
  • 会不会是您使用的是新配置的相对路径,在交换时找不到?
  • 其实是绝对路径。问题似乎是配置文件实际上并没有被换出。我可以将端点放入 API 的 web 配置文件中,它可以工作,问题是我想避免这种情况,因为系统有大约 400 个不同的端点可以使用
  • 你试过调试吗? AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE") 显示什么?

标签: web-services wcf asp.net-web-api config


【解决方案1】:

好问题!
简短回答:
您不能交换配置,因为 Web 应用程序使用在 AppDomain 启动时用于初始化的配置文件层次结构,所以这将需要重新启动 AppDomain,所有内存中的更改都将丢失(这就是“配置交换类”程序集的工作方式 - 在内存中执行所有操作)。

详细信息:
我做了一些挖掘,这是我发现的:

  1. 这与您使用“Config Swapper Class”程序集加载程序集的方式无关,没有任何可能受此影响。
  2. 如果您的实际配置存在于内存中,则重新启动 AppDomain 毫无意义 - 所有更改都将丢失。除了 web.config 之外,您可能会想到另一种方法来存储您的配置?
  3. 提到的程序集(好东西,顺便说一句!)在控制台应用程序中工作,因为它在内部使用ConfigurationManager,它本身使用ClientConfigurationSystem实现IInternalConfigSystem接口。 Web 应用程序使用 WebConfigurationManager,它使用该接口的其他实现 - HttpConfigurationSystem
    因此,“Config Swapper Class”程序集不会在 Web 应用程序中为您提供帮助,因为它在不同的内部类集上运行。

【讨论】:

  • 我其实很害怕这个答案,但嘿,它是正确的,那么你能做对吗?感谢您的帮助。
  • 是的,很遗憾,因为动态切换配置的想法很有趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
相关资源
最近更新 更多