Dotnet Core应用程序:如何在输出文件夹中使用appsettings文件进行构建

3

我遇到了这个错误:

Unhandled Exception: System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional. The physical path is '/ONEDRIVE/OneDrive - SE/LuloTV/Azure Search/DemoSearchIndexer/bin/Debug/netcoreapp2.2/appsettings.json'.
   at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload)
   at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
   at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
   at DemoSearchIndexer.Program.Main(String[] args) in /ONEDRIVE/OneDrive - SE/LuloTV/Azure Search/DemoSearchIndexer/Program.cs:line 16

JSON文件位于源代码目录中,但似乎需要在二进制文件夹中找到该文件。
在使用dotnet run运行应用程序之前,我执行了dotnet build,希望它会将JSON文件复制到输出构建文件夹中,但实际上并没有这样做。

enter image description here

代码如下:

using System;
using System.Linq;
using System.Threading;
using Microsoft.Azure.Search;
using Microsoft.Azure.Search.Models;
using Microsoft.Extensions.Configuration;
using Microsoft.Spatial;

namespace DemoSearchIndexer
{
    class Program
    {
        static void Main(string[] args)
        {
            IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
            IConfigurationRoot configuration = builder.Build();

            SearchServiceClient serviceClient = CreateSearchServiceClient(configuration);

            string indexName = configuration["SearchIndexName"];

            ISearchIndexClient indexClientForQueries = CreateSearchIndexClient(indexName, configuration);

            RunQueries(indexClientForQueries);

            Console.WriteLine("{0}", "Complete.  Press any key to end application...\n");
            Console.ReadKey();
        }

        private static SearchIndexClient CreateSearchIndexClient(string indexName, IConfigurationRoot configuration)
        {
            string searchServiceName = configuration["SearchServiceName"];
            string queryApiKey = configuration["SearchServiceQueryApiKey"];

            SearchIndexClient indexClient = new SearchIndexClient(searchServiceName, indexName, new SearchCredentials(queryApiKey));
            return indexClient;
        }
        private static SearchServiceClient CreateSearchServiceClient(IConfigurationRoot configuration)
        {
            string searchServiceName = configuration["SearchServiceName"];
            string adminApiKey = configuration["SearchServiceAdminApiKey"];

            SearchServiceClient serviceClient = new SearchServiceClient(searchServiceName, new SearchCredentials(adminApiKey));
            return serviceClient;
        }

        private static void RunQueries(ISearchIndexClient indexClient)
        {
            SearchParameters parameters;
            DocumentSearchResult<Role> results;

            Console.WriteLine("Search the entire index for the term 'Administrador' and return only the RoleName field:\n");

            parameters = new SearchParameters()
                         {
                             Select = new[] { "RoleName" }
                         };

            results = indexClient.Documents.Search<Role>("Administrator", parameters);

            WriteDocuments(results);

            Console.Write("Apply a filter to the index to find roles  with a rolename:Usuario, ");
            Console.WriteLine("and return the hotelId and description:\n");

            parameters = new SearchParameters()
                         {
                             Filter = "RoleName:'Partner')",
                             Select = new[] { "Id", "RoleName" }
                         };

            results = indexClient.Documents.Search<Role>("*", parameters);

            WriteDocuments(results);

            Console.Write("Search the entire index, order by a specific field (Id) ");
            Console.Write("in descending order, take the top two results, and show only rolename and id");


            parameters = new SearchParameters()
                         {
                             OrderBy = new[] { "Id desc" },
                             Select = new[] { "Id", "RoleName" },
                             Top = 2
                         };

            results = indexClient.Documents.Search<Role>("*", parameters);

            WriteDocuments(results);

            Console.WriteLine("Search the role names for the term 'Superadministrator':\n");

            parameters = new SearchParameters()
            {
                SearchFields = new[] { "RoleName" }
            };
            results = indexClient.Documents.Search<Role>("Superadministrator", parameters);

            WriteDocuments(results);
        }

        private static void WriteDocuments(DocumentSearchResult<Role> searchResults)
        {
            foreach (SearchResult<Role> result in searchResults.Results)
            {
                Console.WriteLine(result.Document);
            }

            Console.WriteLine();
        }
    }
}

appsettings.json 文件中的 CopyToTheOutputDirectory 属性设置为 CopyIfNewer 或 CopyAlways 了吗? - Lorenzo Isidori
你想要将 appsettings.json 放在 bin 目录中吗?如果是,请快速回复。 - Hardik Masalawala
是的,基本上是这样。 - Luis Valencia
@LorenzoIsidori 怎么做?这是Vs code,不是Visual Studio,没有属性窗格。 - Luis Valencia
2个回答

6
您可以在您的csproj文件中添加一个ItemGroup,它看起来应该像这样:
<ItemGroup>
    <None Update="appsettings.json">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
</ItemGroup>

2

我一直在寻找这个问题的答案,大多数帖子都提到了现已被弃用的project.json文件,而现在应该使用.csproj文件。

最初的回答:

<Project>
    <ItemGroup>
        <None Include="appsettings.json" CopyToOutputDirectory="Always" />
    </ItemGroup>
</Project>

project.json 格式已经被弃用多年,自 Visual Studio 2017 发布以来。我认为它可能只在 .NET Core 1.0 上有效,但最后一点可能是我搞错了。 - ForeverZer0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接