NLog、ASP.NET Core和SQL - 服务器未找到或无法访问

5
我一直在尝试将ASP.NET Core网站与NLog配合使用。在尝试写入SQL数据库时,出现了问题。我已经尝试过本地数据库和Azure数据库,但问题仍然存在。我甚至将nlog表添加到已知的数据库中,该数据库已经与EF连接()。
我正在使用nuget软件包:NLog.Web.AspNetCore 不管怎样,我都会得到以下结果:
错误 写入数据库时发生错误。异常: System.Data.SqlClient.SqlException (0x80131904):在建立到SQL Server的连接时发生网络相关或特定于实例的错误。未找到服务器或无法访问服务器。请验证实例名称是否正确,并配置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"
    }
  }
}
2个回答

3

您在数据库目标中未使用变量“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

没错 @Julian。我曾经在某个地方读到过,在目标中使用连接字符串是有问题的。所以,我改用了这个:LogManager.Configuration.Variables["connectionString"] = Configuration.GetConnectionString("DefaultConnection"); 我会再试一次,在nlog配置文件中将数据放入目标节点。 - Schwammy
你仍然需要 LogManager.Configuration.Variables["connectionString"] = Configuration.GetConnectionString("DefaultConnection"); - 你需要两者(配置和C#)。 - Julian
两个都试试?好的,我会尝试一下!测试完后我会在这里更新。 - Schwammy
没错,就是这样。我需要将变量设置为连接字符串,然后在配置中使用该变量。回想起来,这很合理。感谢@Julian的帮助。 - Schwammy
是的!我认为在NLog中加入警告信息会很好 ;) - Julian

-1

首先,

连接字符串看起来是不同的

如果你正在使用本地,你可能会遇到这个错误。但是如果你有一个服务器定义代码,就像这样。

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

在我看来:第二个错误原因可能是您无法正确读取connectionString。

感谢@aemre。我尝试了一些不同的连接字符串,但都没有成功。您建议的格式,包括providerName属性,对于ASP.NET Core appSettings.json文件无效。 - Schwammy
好的 @AndySchwam,当我回答这个问题时还没有CORE。对此非常抱歉。这个链接可能会对你有所帮助 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration - aemre

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