Не удалось найти тип для класса Microsoft.WindowsAzure.Diagnostics

Только что вернулся из отпуска и вошел, чтобы внести небольшие изменения в наше приложение, когда я столкнулся с этой ошибкой:

Не удалось найти тип для класса Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version = 2.1.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35.

Кодекс работал отлично до возвращения из отпуска. Последний раз он был опубликован Azure 3 недели назад, и теперь у него такая же проблема. Локально я попытался исправить это, удалив add, добавив следующий раздел конфигурации назад:

<system.diagnostics>
    <trace>
        <listeners>
            <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics">
            </add>
        </listeners>
    </trace>
</system.diagnostics>

Добавить добавление и удаление ссылки на сборку:

enter image description here

Когда я отлаживаю проект локально, Visual Studio разбивается на следующую строку:

NewRelic.Api.Agent.NewRelic.IgnoreTransaction();

Это работало как локально, так и в производстве до 2 дней назад (согласно журналу ошибок).

Полная трассировка стека:

[ConfigurationErrorsException: Couldn't find type for class Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.]
   System.Diagnostics.TraceUtils.GetRuntimeObject(String className, Type baseType, String initializeData) +6755367
   System.Diagnostics.TypedElement.BaseGetRuntimeObject() +45
   System.Diagnostics.ListenerElement.GetRuntimeObject() +83
   System.Diagnostics.ListenerElementsCollection.GetRuntimeObject() +143
   System.Diagnostics.TraceInternal.get_Listeners() +181
   System.Diagnostics.TraceInternal.WriteLine(String message) +119
   System.Diagnostics.Trace.WriteLine(String message) +4
   NewRelic.Api.Agent.NewRelic.IgnoreTransaction() +13
   Linklicious2.Controllers.ApiController.GetLinksToPing(Boolean test) +46
   lambda_method(Closure , ControllerBase , Object[] ) +98
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +214
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
   System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +55
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +253
   System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +21
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +191
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +324
   System.Web.Mvc.Controller.ExecuteCore() +106
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +91
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
   System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +34
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +19
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +48
   System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9631764
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

Ответ 2

Пока у меня была ссылка на проект и локальная копия Microsoft.WindowsAzure.Diagnostics.dll в моем пакете облачных сервисов, оказалось, что вам также нужна копия MonAgentListener.dll в пакете - после добавления этого файла он начал работать еще раз.

В частности, я использую Microsoft.WindowsAzure.Diagnostics.dll version 2.8.0.0, размер 35,608 bytes (34.7KB). Это тот же файл, что и C:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Microsoft.WindowsAzure.Diagnostics.dll.

И MonAgentListener.dll версия 33.1.5.0, 74,448 bytes (72.7KB) в размере, и это тот же файл, что и C:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\MonAgentListener.dll.

Не путайте эту версию версии Microsoft.WindowsAzure.Diagnostics.dll с 35 КБ с версией 311 КБ в C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Windows Azure Tools Diagnostics 1.0\Microsoft.WindowsAzure.Diagnostics.dll или C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Windows Azure Tools\v2.9\Microsoft.WindowsAzure.Diagnostics.dll, которые оба помечены как версия 2.4.6489.4.

В моем проекте используется расширение Azure PaaSDiagnostics (которое использует Azure PowerShell и Azure Portal) вместо Microsoft.WindowsAzure.Plugins.Diagnostics плагина, который является более старым версии диагностики облачных сервисов (которая использует теперь устаревшую "плагиновую" модель вместо текущей модели "расширения" ). Учитывая, что Extensions предназначены для работы с любым облачным сервисом - оказывается, вам все равно нужно ссылаться на эти сборки и включать их в свой пакет - расширение не сделает этого для вас.

Но для того, чтобы сделать вещи более запутанными: если у вас есть проект VS Cloud Service, то Visual Studio 2015 и даже Visual Studio 2017 по-прежнему используют старую систему плагинов, если вы используете систему развертывания VS Cloud Project.

(Учитывая, что система "Облачная служба" устарела и поддерживается только старым API-интерфейсом Azure "Управление сервисами" и не поддерживается API-интерфейсом "Управление ресурсами" текущего поколения и не удивительно, что MS не инвестировал в улучшение инструментария для облачных сервисов в Visual Studio, но эта путаница между плагинами и расширениями (как для диагностики, так и для удаленного рабочего стола) задерживала мой проект по неделям, в то время как я исследовал, что я должен делать.

Также убедитесь, что ссылка на <облако службы > Microsoft.WindowsAzure.ServiceRuntime.dll установлена ​​ Copy Local = True. Это также скопирует файлы WindowsAzureEventSource.dll и WindowsAzureTelemetryEvents.dll на ваш вывод - и убедитесь, что все 3 файла включены в пакет облачных сервисов.

TL; DR:

  • Убедитесь, что у вас есть эти файлы в вашем пакете пакетов Cloud Service (поэтому они развернуты до E:\approot при развертывании)

    File                                       Version        Size (bytes)
    Microsoft.WindowsAzure.Diagnostics.dll           2.8.0.0        35,608
    MonAgentListener.dll                            33.1.5.0        74,448
    Microsoft.WindowsAzure.ServiceRuntime.dll   2.7.1198.768       158,624
    WindowsAzureEventSource.dll                 2.7.1198.768        83,872
    WindowsAzureTelemetryEvents.dll             2.7.1198.768        24,992
    
  • Также убедитесь, что в проекте Cloud Service Worker Role есть файл App.config с этим:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <system.diagnostics>
            <trace>
                <listeners>
                    <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener,Microsoft.WindowsAzure.Diagnostics,Version=2.8.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics">
                        <!-- Ignore the VS-generated message "The attribute 'type' is not allowed." -->
                        <filter type="" />
                    </add>
                </listeners>
            </trace>
        </system.diagnostics>
        <startup>
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
        </startup>
    </configuration>