【问题标题】:Running .NET Core 2.0 API from the command line从命令行运行 .NET Core 2.0 API
【发布时间】:2018-02-15 01:53:27
【问题描述】:

当我在 Visual Studio 2017 中运行使用 HttpSys 的 .NET Core 2.0 编写的 REST API 时,我得到以下输出:

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

当我从命令行运行相同的应用程序时

dotnet myapp

我得到这个输出:

dotnet MyApp.dll exe 路径:C:\Program Files\dotnet\dotnet.exe 目录:C:\Program Files\dotnet 连接 字符串:信息: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0] 用户配置文件可用。使用 'C:\Users\Torsten\AppData\Local\ASP.NET\DataProtection-Keys' 作为键 存储库和 Windows DPAPI 以加密静态密钥。 System.ArgumentNullException:值不能为空。参数名称: 连接字符串

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

连接字符串在 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();
    }

【问题讨论】:

  • 您必须询问创建Configuration 的内容,因为那是未正确初始化的内容。依赖注入很有趣!
  • 您是从应用程序目录运行命令吗?配置加载默认为当前工作目录..
  • 是的。我从应用程序目录运行它。
  • 我也试过Start-process -FilePath dotnet.exe MyApp.dll -workingdirectory . 同样的结果。
  • 不过,这看起来像 PowerShell。 PowerShell 中的当前位置与 Windows 中的当前目录不同。先试试[Environment]::CurrentDirectory = pwd

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


【解决方案1】:

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

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

C:\Users\Somebody\source\repos\MyApp\MyApp

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

C:\Users\Somebody\source\repos\MyApp\MyApp\bin\debug\netcoreapp2.0

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 同时检查您的 C:\Users\Torsten\AppData\Local\ASP.NET\DataProtection-Keys\....xml 文件以引用 Microsoft.AspNetCore.DataProtection,版本 = 2.0.0.0。如果您在开发环境中,在修复您的 csproj 文件后,您可以删除该文件,并使用正确的引用版本重新创建它
    • 我没有迁移。我从 DotNet Core 2.0 开始。一切都指向 2.0.0 版本。谢谢你的建议。
    • 如果您以详细模式(使用 -v 选项)运行 dotnet,您将获得哪个输出?
    • 我无法使用 -v 选项调用 dotnet。如果我调用dotnet -v MyApp.dll,它会列出所有可能的命令行开关。如果我打电话给dotnet MyApp.dll -v,我会得到一个异常Unhandled Exception: System.FormatException: The short switch '-v' is not defined in the switch mappings.
    • 您可以使用 sdk-options 或 runtime-options 运行 dotnet。详细模式不是运行时选项中的选择。 sdk-options 已运行、构建等。我很抱歉没有太明确,但我想说的是 dotnet run -v diag
    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2019-04-27
    • 2013-12-27
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    相关资源
    最近更新 更多