NLog & GrowlNotify, добавленная сборка не может быть найдена после развертывания

Я использую NLog и Growl. Локально работает. При развертывании веб-сайта я получаю сообщение об ошибке:

Exception: NLog.NLogConfigurationException: Exception when parsing E:\Websites\SPECIFICATION\NLog.config.  ---> System.ArgumentException: Target cannot be found: 'NLog.Targets.GrowlNotify'

Но эта DLL существует в моем каталоге bin. Я добавил все необходимые файлы через Nuget.

И мой конфигурационный файл:

  <?xml version="1.0" encoding="utf-8"?>
<nlog xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" autoReload="true" throwExceptions="false" throwConfigExceptions="true" internalLogToConsole="true" internalLogLevel="Trace" internalLogFile="E:\Websites\SPECIFICATION\App_Data\log.txt" xmlns:p1="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">


  <variable name="myvar" value="myvalue" />

 <extensions>
     <add assembly="NLog.Targets.GrowlNotify" />
</extensions>
 <targets>
<target name="db" xsi:type="Database" connectionString="Data Source=AA;Initial Catalog=BB;User ID=SA;Password=BBBB" connectionStringName="SC" 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>
   <target name="growl" xsi:type="GrowlNotify" password="" host="192.168.1.10" port="23053"/>
  </targets>

<rules>
  <!-- add your logging rules here -->
  <logger name="*" minlevel="Trace" writeTo="db" />

  <logger name="*" minLevel="Trace" writeTo="growl" /> 
</rules>

</nlog>

Я не уверен, почему это работает локально, но не на развернутой версии. Они одинаковые. И DLL существует на обоих. Есть идеи?

Обновить:

После включения регистрации привязки я получаю следующие сообщения журнала:

Assembly manager loaded from:  

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable  c:\windows\system32\inetsrv\w3wp.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = NLog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c
 (Fully-specified)
LOG: Appbase = file:///E:/Websites/SPECIFICATION/
LOG: Initial PrivatePath = E:\Websites\SPECIFICATION\bin
Calling assembly : NLog.Targets.GrowlNotify, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: E:\Websites\SPECIFICATION\web.config
LOG: Using host configuration file: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet.config
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: NLog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/specification/f65047fd/2d5397dc/NLog.DLL.
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/specification/f65047fd/2d5397dc/NLog/NLog.DLL.
LOG: Attempting download of new URL file:///E:/Websites/SPECIFICATION/bin/NLog.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

Связано ли это с тем, что nuget не может загружать последние пакеты на рабочий сервер? Но если ошибка связана с NLog.dll, почему NLog просто логирует мою базу данных, и не работает только рычание?

1 ответ

Решение

NLog.Grow - это сборка для NLog 2. Поскольку NLog имеет строгое имя, строгие имена должны совпадать.

NLog.Web использует NLog 4, и строгое название для всех версий NLog 4.x - 4.0.0.0.

Чтобы исправить эти проблемы, вам нужно bindingRedirect в вашем.config:

  <dependentAssembly>
    <assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
  </dependentAssembly>

Но учтите, что это не на 100% безопасно, поскольку внесение изменений может привести к ошибкам несоответствия методов.

Другие вопросы по тегам