在 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,这可能对您的情况有所帮助。
希望对您有所帮助。
嗯,这是我解决这个问题的方法:
- 从 API 应用程序下载 Swagger 文件到本地硬盘。
- 将本地 Swagger 文件导入 Web 应用程序以生成 class具有我的代码命名而不是环境命名的 es。
- 使用 AppSettings 指定特定于环境的设置以指向 API 应用程序。这可以是 web.config 转换,也可以只在应用程序设置中的 Web 应用程序的 Azure 门户中指定它们。
- 使用构造函数实例化生成的 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 文件的解决方案,但总而言之,如果这是唯一必要的解决方法,那也不是那么糟糕。
我正在将一个组合的 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,这可能对您的情况有所帮助。
希望对您有所帮助。
嗯,这是我解决这个问题的方法:
- 从 API 应用程序下载 Swagger 文件到本地硬盘。
- 将本地 Swagger 文件导入 Web 应用程序以生成 class具有我的代码命名而不是环境命名的 es。
- 使用 AppSettings 指定特定于环境的设置以指向 API 应用程序。这可以是 web.config 转换,也可以只在应用程序设置中的 Web 应用程序的 Azure 门户中指定它们。
- 使用构造函数实例化生成的 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 文件的解决方案,但总而言之,如果这是唯一必要的解决方法,那也不是那么糟糕。