如何在 ASP.Net MVC 应用程序的构建期间合并第三方 api 调用

How to incorporate a third party api call during build time in ASP.Net MVC Application

好的,这是我的故事。

我有一个 ASP.Net MVC Web 应用程序,它运行良好。但它需要一些 .resx 文件(一些已翻译 culture/language)文件,该文件来自制作 API Call to a third party end point。这些.resx文件需要带入应用程序对应的文件夹everytime my web project builds。因为这些 resx 文件可能会在第三方位置更改,所以每次我 运行 在我的 Web 应用程序上构建时,我都需要获取 新文件

项目 1: 所以到目前为止,我有一个 MVC Web 应用程序,运行 还不错。 (主要应用)

项目 2: 我创建了另一个小型控制台应用程序(只是一个基本应用程序),它有一个调用第三方并获取 .resx 文件并保存的端点到一个位置。

问题一:

为了完成我想要的,我需要一个单独的项目2,它将进行第三方调用并将文件复制到项目1对应的目录中。

问题二:

Project 2调用第三方需要console application或者mvc application什么的?我不确定

问题三:

我走的方向对吗?当我的 项目 1 构建时,我想要它,我想调用第三方 API 并将一些文件下载到特定文件夹。

问题四:

我需要玩 MS-Build 来执行项目 2.exe,然后再执行项目 1.exe。这样当项目 1.exe 开始构建时文件就在那里?

问题 5:

我真的需要一个完全独立的项目来进行 API 调用以获取 resx 文件吗?

请指导我。

项目 2 代码:

     class Program
{
    static void Main(string[] args)
    {
        Task.Run(() => CallHttp());
        System.Console.ReadLine();
    }
    // Simple async function returning a string...
    static public async void CallHttp()
    {
        var client = new HttpClient();
        client.BaseAddress = new Uri("https://api.crowdin.com/");
        HttpResponseMessage response = await client.GetAsync("api/project/refele/download/all.zip?key=f23e2c91833c0de737");
        using (Stream stream = await response.Content.ReadAsStreamAsync())
        using (FileStream fs = new FileStream(@".\..\..\alpha\test.zip", FileMode.Create))
            await stream.CopyToAsync(fs);
        System.IO.Compression.ZipFile.ExtractToDirectory(@".\..\..\alpha\test.zip", @".\..\..\beta");
    }

}

在您的 project1 csproj 文件中,您可以按以下方式指定 post 构建的事件:

<PropertyGroup>
  <PostBuildEvent>
    Call "FullyResolvedPathToYour.exe" "Arg1" "Arg2"
  </PostBuildEvent>
</PropertyGroup>

我不知道你的exe是怎么调用的,所以你得自己调整来满足你的要求。另请注意,您可以使用以下格式的 Visual Studio 环境变量和系统环境变量:$(Variable)

有关此概念的更多信息,您可以阅读此处:https://docs.microsoft.com/en-us/visualstudio/ide/how-to-specify-build-events-csharp?view=vs-2017

如果需要,您可以使用 CURL 对端点进行 API 调用。所以你不必编写自定义 exe 文件来下载你的 resx。它的用法超出了这个答案。我不是这方面的专家。无论如何,您可以在构建 csproj 文件之前调用它。

如果您在构建后调用 API,请不要使用 <PostBuildEvent>。这就像拿着锤子去做手术。矫枉过正。请改用目标。

<Target Name="Call your Stuff" AfterTargets="Build">
    <Exec Command="FullyResolvedPathToYour.EXE arg1 arg2 etc" WorkingDirectory="..." />
</Target>

如果您需要在构建之前调用此目标,只需将 AfterTargets 更改为 BeforeTargets 在 msdn for Targets 上有很多关于 msbuild 的文档。