从命令行运行dotnet core 2.0 api

时间:2017-09-06 14:10:55

标签: c# windows .net-core connection-string

当我在Visual Studio 2017中运行使用HttpSys的dotnet core 2.0编写的REST Api时,我得到以下输出:

  

执行路径:C:\ Program Files \ dotnet \ dotnet.exe目录:C:\ Program
  Files \ dotnet连接字符串:
  服务器=(的LocalDB)\ mssqllocaldb;数据库= MyApp的; Trusted_Connection = TRUE; MultipleActiveResultSets =真
  托管环境:开发内容根路径:
  C:\ Users \ Torsten \ source \ repos \ MyApp \ MyApp正在收听   on:http:// *:5000应用程序已启动。按Ctrl + C关闭。

当我使用

从命令行运行相同的应用程序时
dotnet myapp

我得到了这个输出:

  

dotnet MyApp.dll执行路径:C:\ Program
  Files \ dotnet \ dotnet.exe目录:C:\ Program Files \ dotnet连接
  string:info:
  Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager [0]
        用户个人资料可用。使用' C:\ Users \ Torsten \ AppData \ Local \ ASP.NET \ DataProtection-Keys'作为关键词   存储库和Windows DPAPI在静止时加密密钥   System.ArgumentNullException:值不能为null。参数名称:
  connectionString

为什么从命令行启动时无法识别连接字符串?

连接字符串在appsettings.json中定义为:

{
  "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyApp;Trusted_Connection=True;MultipleActiveResultSets=true" },

Startup.cs读取:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
        Console.WriteLine("Exe path : " + pathToExe);
        Console.WriteLine("Directory : " + Path.GetDirectoryName(pathToExe));
        Console.WriteLine("Command line arguments :" + String.Join(", ",Environment.GetCommandLineArgs()));
        Console.WriteLine("Connection string : " + Configuration["ConnectionStrings:DefaultConnection"]);
        services.AddDbContext<MyAppContext>(options =>
            options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));
        services.AddMvc();
    }

2 个答案:

答案 0 :(得分:2)

无法读取ConnectionString的原因是,appsettings.json默认情况下不会被复制到输出目录。仅当您将复制到输出目录配置为复制如果较新复制始终时,它才会复制到输出目录。 您可以通过查看env.ContentRootPath方法中的Configure来区分。

从Visual Studio中启动时,ContentRootPath是项目目录。

  

C:\ Users \用户有人\源\回购\ MyApp的\ MyApp的

从命令行启动时,ContentRootPath是输出目录。

  

C:\ Users \用户有人\源\回购\ MyApp的\ MyApp的\ BIN \调试\ netcoreapp2.0

答案 1 :(得分:0)

从项目文件夹中重新运行带有-v开关的dotnet命令以查看结果。如果您看到对。 .. \ microsoft.entityframeworkcore.tools.dotnet \ 1.0.0 .. 的引用,则问题在于CLIToolReference,必须更新。

当我从旧版本的asp.net核心迁移项目时,我遇到了同样的问题。迁移后,DotNetCliToolReference不会自动更新。 更新 yourproject.csproj 文件以使用CLI的 2.0.0 版本,如下面的代码段所示:

<ItemGroup>

        ...
          <DotNetCliToolReference 
               Include="Microsoft.EntityFrameworkCore.Tools.DotNet" 
               Version="2.0.0" />
</ItemGroup>