C# dotnet核心应用程序,如何将appsettings文件构建到输出文件夹

C# dotnet核心应用程序,如何将appsettings文件构建到输出文件夹,c#,.net,.net-core,C#,.net,.net Core,我有一个错误: 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/app

我有一个错误:

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文件复制到output build文件夹,但它不会

代码如下所示:

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();
        }
    }
}
使用系统;
使用System.Linq;
使用系统线程;
使用Microsoft.Azure.Search;
使用Microsoft.Azure.Search.Models;
使用Microsoft.Extensions.Configuration;
使用Microsoft.Spatial;
命名空间搜索索引器
{
班级计划
{
静态void Main(字符串[]参数)
{
IConfigurationBuilder=new ConfigurationBuilder().AddJsonFile(“appsettings.json”);
IConfigurationRoot配置=builder.Build();
SearchServiceClient=CreateSearchServiceClient(配置);
字符串indexName=配置[“SearchIndexName”];
ISearchIndexClient IndexClient ForQueries=CreateSearchIndexClient(indexName,配置);
运行查询(indexClientForQueries);
Console.WriteLine(“{0}”,“完成。按任意键结束应用程序…\n”);
Console.ReadKey();
}
私有静态SearchIndexClient CreateSearchIndexClient(字符串indexName,IConfigurationRoot配置)
{
字符串searchServiceName=配置[“searchServiceName”];
字符串QueryAPI键=配置[“SearchServiceQueryAPI键”];
SearchIndexClient indexClient=新的SearchIndexClient(searchServiceName、indexName、新的SearchCredentials(QueryApKey));
返回indexClient;
}
专用静态SearchServiceClient CreateSearchServiceClient(IConfigurationRoot配置)
{
字符串searchServiceName=配置[“searchServiceName”];
字符串adminApiKey=配置[“SearchServiceAdminApiKey”];
SearchServiceClient serviceClient=新的SearchServiceClient(searchServiceName,新的SearchCredentials(adminApiKey));
返回服务客户端;
}
专用静态void运行查询(ISearchIndexClient indexClient)
{
搜索参数;
记录搜索结果;
WriteLine(“在整个索引中搜索术语‘Administrator’并仅返回RoleName字段:\n”);
参数=新的SearchParameters()
{
Select=new[]{“RoleName”}
};
结果=indexClient.Documents.Search(“管理员”,参数);
减记文件(结果);
Write(“对索引应用筛选器以查找角色名为:Usuario”的角色,”;
Console.WriteLine(“并返回hotelId和说明:\n”);
参数=新的SearchParameters()
{
Filter=“RoleName:‘合作伙伴’”,
Select=new[]{“Id”,“RoleName”}
};
结果=indexClient.Documents.Search(“*”,参数);
减记文件(结果);
Write(“搜索整个索引,按特定字段(Id)排序)”;
Write(“按降序,取前两个结果,只显示rolename和id”);
参数=新的SearchParameters()
{
OrderBy=new[]{“Id desc”},
Select=new[]{“Id”,“RoleName”},
Top=2
};
结果=indexClient.Documents.Search(“*”,参数);
减记文件(结果);
WriteLine(“在角色名称中搜索术语‘超级管理员’:\n”);
参数=新的SearchParameters()
{
SearchFields=new[]{“RoleName”}
};
结果=indexClient.Documents.Search(“超级管理员”,参数);
减记文件(结果);
}
私有静态无效写文档(DocumentSearchResult searchResults)
{
foreach(searchResults.Results中的SearchResult)
{
Console.WriteLine(结果文件);
}
Console.WriteLine();
}
}
}

您可以向
csproj
文件中添加一个
ItemGroup
,其外观如下:

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();
        }
    }
}

保存最新

我一直在寻找这个问题的答案,我找到的大多数帖子都引用了project.json文件,该文件现在已被弃用,取而代之的是.csproj

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


appsettings.json是否将CopyToTheOutputDirectory属性设置为CopyIfNewer或CopyAlways?是否希望在bin目录中设置appsettings.json?如果是,则基本上回答是yes@LorenzoIsidori怎样?这是Vs代码,不是visual studio,自visual studio 2017发布以来,
project.json
格式已被弃用多年。我认为它可能只在.NETCore1.0上有效,但在最后一点上我可能弄错了。