在开发/测试/生产环境中使用带有Swagger的API应用



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

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

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

当我做Add/Azure API App Client到我的UI-only项目开始引用API应用程序,我把它指向MyAppDevApi,它使用AutoRest在我的代码中创建类。这些类现在都有MyAppDevApi的名称,而不仅仅是MyAppApi,这是我部署到每个环境的代码的实际名称空间。很明显,我不能登记……我如何通过测试和生产来推广它?

在Swagger JSON中没有提到这个名字,所以它一定是在AutoRest端(我认为)。

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

编辑

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

问题是,然后我必须编辑生成的MyAppApi.cs文件的_baseUri属性以从AppSetting中拉出,有不同的web.config.dev, .test, .prod,然后做web。配置转换。我的意思是,那可以工作,但是每次我改变API App的界面,我就会重新生成。然后我要记得改变_baseUri再次…有些人有时会忘记这样做,然后将其部署到生产环境。它真的非常非常脆弱。

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

我不太确定你为什么要创建三个不同的应用程序,每个环境一个?一个应用程序是好的,使用web。为每个环境进行配置转换。这是我做所有应用程序的一般方法,效果很好。

关于如何应用web的信息。配置转换可以在这里找到,这可能对你的情况有帮助。

希望对你有帮助。

我是这样解决这个问题的:

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

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

最新更新