在 dev/test/production 环境中将 API 应用与 Swagger 结合使用

Using API Apps with Swagger in dev/test/production environments

我正在将一个组合的 Azure 网站(包含控制器和 ApiController)迁移到一个拆分的 Web 应用程序和 API 应用程序。我们称它为 MyApp。

我已经创建了 MyAppDevApi、MyAppTestApi 和 MyAppProductionApi API 应用程序(在不同的应用程序服务中)来托管这三个环境,期望将代码从一个环境提升到另一个环境。

到目前为止,我只部署到 MyAppDevApi,因为我才刚刚开始。

当我对我的 UI-only 项目执行 Add/Azure API App Client 以开始引用 API 应用程序时,我将其指向 MyAppDevApi,它使用 AutoRest 创建 类 在我的代码中。这些 类 现在都有名称 MyAppDevApi,而不仅仅是 MyAppApi,它是我部署到每个环境的代码的实际命名空间。显然,我无法检查...我如何通过测试和生产来推广它?

Swagger JSON 中没有任何引用此名称的内容,因此它必须在 AutoRest 方面(我认为)。

有没有人想出一个策略或解决方法来处理 API 应用程序的这个多环境推广问题?

编辑

到目前为止,我想到的最好的办法是将 Swagger 从 API 应用程序下载到本地文件(同样,它只有来自原始代码的命名空间,而不是来自API 应用程序的名称),然后将其导入 Web 应用程序。这将在具有我期望的命名的 Web 应用程序中生成 类。

问题是我必须编辑生成的 MyAppApi.cs 文件的 _baseUri 属性 以从 AppSetting 中提取,具有不同的 web.config.dev、.test、.prod 和然后进行 web.config 转换。我的意思是,这行得通,但是每次我更改 API 应用程序的界面时,我都会重新生成...然后我会记得再次更改 _baseUri...有人,有时是忘记这样做然后部署到生产环境。它真的非常脆弱。

所以...有人有更好的主意吗?

我不太清楚您为什么要创建三个不同的应用程序,每个环境一个?一个应用程序很好,每个环境使用 web.config 转换。这是我制作所有应用程序的一般方式,并且运行良好。

可以找到有关如何应用 web.config 转换的信息here,这可能对您的情况有所帮助。

希望对您有所帮助。

嗯,这是我解决这个问题的方法:

  1. 从 API 应用程序下载 Swagger 文件到本地硬盘。
  2. 将本地 Swagger 文件导入 Web 应用程序以生成 class具有我的代码命名而不是环境命名的 es。
  3. 使用 AppSettings 指定特定于环境的设置以指向 API 应用程序。这可以是 web.config 转换,也可以只在应用程序设置中的 Web 应用程序的 Azure 门户中指定它们。
  4. 使用构造函数实例化生成的 API App Client,该构造函数接受 URL 以指向 API App(它们处于 class 级别,因此是静态的):
    private readonly static Uri apiAppUrl = new Uri(CloudConfigurationManager.GetSetting("ApiAppUrl"));
    private readonly static MyAppApi myAppApi = new MyAppApi(apiAppUrl);

我仍然喜欢不需要下载 Swagger 文件的解决方案,但总而言之,如果这是唯一必要的解决方法,那也不是那么糟糕。