【问题标题】:NLog, ASP.NET Core and SQL - The server was not found or was not accessibleNLog、ASP.NET Core 和 SQL - 找不到服务器或无法访问服务器
【发布时间】:2017-04-24 13:26:49
【问题描述】:

我一直在尝试让 ASP.NET Core 站点使用 NLog。在我尝试写入 SQL 数据库之前,它工作正常。我已经尝试过本地数据库和 Azure 数据库——都遇到了同样的问题。我什至已将 nlog 表添加到一个已知数据库中,该数据库已经连接到该站点(使用 EF)。

我正在使用 nuget 包:NLog.Web.AspNetCore

无论如何,我得到以下信息:

写入数据库时​​出错。例外: System.Data.SqlClient.SqlException (0x80131904):网络相关或 建立连接时发生特定于实例的错误 SQL 服务器。服务器未找到或无法访问。核实 实例名称正确且 SQL Server 配置为 允许远程连接。

这是我的配置方式(我已尝试更改这些语句的顺序):

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
            loggerFactory.AddNLog();
            app.AddNLogWeb();
            env.ConfigureNLog("nlog.config");
            LogManager.Configuration.Variables["connectionString"] = Configuration.GetConnectionString("DefaultConnection");
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
//etc...

这是我的 nlog 配置:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="Warn"
      internalLogFile="c:\temp\internal-nlog.txt">

  <!-- define various log targets -->
  <targets>
    <target name="db"
            xsi:type="Database"
            commandType="StoredProcedure"
            commandText="[dbo].[NLog_AddEntry_p]">
      <parameter name="@machineName"    layout="${machinename}" />
      <parameter name="@siteName"       layout="${iis-site-name}" />
      <parameter name="@logged"         layout="${date}" />
      <parameter name="@level"          layout="${level}" />
      <parameter name="@username"       layout="${aspnet-user-identity}" />
      <parameter name="@message"        layout="${message}" />
      <parameter name="@logger"         layout="${logger}" />
      <parameter name="@properties"     layout="${all-event-properties:separator=|}" />
      <parameter name="@serverName"     layout="${aspnet-request:serverVariable=SERVER_NAME}" />
      <parameter name="@port"           layout="${aspnet-request:serverVariable=SERVER_PORT}" />
      <parameter name="@url"            layout="${aspnet-request:serverVariable=HTTP_URL}" />
      <parameter name="@https"          layout="${when:inner=1:when='${aspnet-request:serverVariable=HTTPS}' == 'on'}${when:inner=0:when='${aspnet-request:serverVariable=HTTPS}' != 'on'}" />
      <parameter name="@serverAddress"  layout="${aspnet-request:serverVariable=LOCAL_ADDR}" />
      <parameter name="@remoteAddress"  layout="${aspnet-request:serverVariable=REMOTE_ADDR}:${aspnet-request:serverVariable=REMOTE_PORT}" />
      <parameter name="@callSite"       layout="${callsite}" />
      <parameter name="@exception"      layout="${exception:tostring}" />
    </target>
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="db" />
  </rules>
</nlog>

最后,这是我的 appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\projectsV13;Database=XXXX;Trusted_Connection=True;MultipleActiveResultSets=true",
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
}

【问题讨论】:

    标签: sql-server asp.net-core nlog


    【解决方案1】:

    您没有在 db 目标中使用变量“connectionString”。

    你还需要

    <target name="db"
       .. 
       connectionString="${var:connectionString}"
    >
    

    NLog 中的变量不会自动绑定到目标。您需要在配置中设置和使用它们。

    更新

    由于 NLog.Web.AspNetCore 4.8(用于 .NET Core 控制台程序的 NLog.Extensions.Logging 1.4),您可以直接从您的 appSettings.json 中读取

    <target name="db"
       .. 
       connectionString="${configsetting:name=ConnectionStrings.DefaultConnection}"
    >
    

    docs

    【讨论】:

    • 没错@朱利安。我在某处读到使用目标中的连接字符串被破坏了。所以我使用的是这个:LogManager.Configuration.Variables["connectionString"] = Configuration.GetConnectionString("DefaultConnection");我将再次尝试使用 nlog 配置中 Target 节点中的数据。
    • 你还需要LogManager.Configuration.Variables["connectionString"] = Configuration.GetConnectionString("DefaultConnection"); - 你需要两者(配置和C#)
    • 两者?好的,我会试试的!测试完我会在这里更新。
    • 是的,就是这样。我需要将两个变量都设置为连接字符串,然后在配置中使用该变量。事后看来,这完全有道理。感谢@Julian 的帮助
    • 是的!我认为 NLog 中的警告信息会很好 ;)
    【解决方案2】:

    首先,

    ConnectionString 看起来不一样

    如果您使用的是本地,则可以接受此错误。但是如果你有服务器 定义代码是这样的。

    "ConnectionStrings": {  "DatabaseContext": "Server=(localdb)\\mssqllocaldb;Database=NAME;Trusted_Connection=True;MultipleActiveResultSets=true"}
    

    在我看来:错误的第二个原因。也许您无法正确读取 connectionString。

    【讨论】:

    • 谢谢@aemre。我尝试了一些不同的连接字符串,但没有运气。您建议的带有 providerName 属性的格式对 ASP.NET Core appSettings.json 文件无效。
    • Okey @AndySchwam,当我回答这个问题时,没有核心。对此非常抱歉。这个链接可以帮助你docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    相关资源
    最近更新 更多