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

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

Не удалось найти тип для класса Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, версия = 2.1.0.0, культура = нейтральная, 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>

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

введите здесь описание изображения

Когда я отлаживаю проект локально, 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

person Jeremy Boyd    schedule 07.01.2014    source источник


Ответы (2)


Если вы не работаете в эмуляторе, посмотрите мой ответ SO здесь - Как устранить ошибку выполнения диагностики Windows Azure (не удалось создать WindowsAzure.Diagnostics, Version=xx, Culture=neutral, PublicKeyToken=xx). Просто добавьте:

<filter level="TraceEventType.Error" />

в разделе <listeners><add>.

person viperguynaz    schedule 07.01.2014
comment
Должно быть type, а не level. - person Seth; 25.01.2017

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

Конкретно я использую Microsoft.WindowsAzure.Diagnostics.dll версию 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.

Не путайте эту 35-килобайтную версию Microsoft.WindowsAzure.Diagnostics.dll с 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 плагина, который является более старой версией диагностики облачных служб (которая использует устаревшую модель «плагинов» вместо текущей модели «расширений»). Учитывая, что расширения предназначены для работы с любой облачной службой — оказывается, вам все равно нужно ссылаться на эти сборки и включать их в свой пакет — расширение не сделает это за вас.

Но чтобы еще больше запутать ситуацию: если у вас есть проект 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:

  1. Убедитесь, что эти файлы есть в вашем файле пакета облачной службы (чтобы они были развернуты в 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
    
  2. Также убедитесь, что в вашем проекте рабочей роли облачной службы есть файл 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>
    
person Dai    schedule 22.05.2017
comment
где я могу найти эти ссылки dll? Я искал пакеты nuget, ссылающиеся на эти DLL, но ничего не нашел. - person Nathan Tregillus; 17.06.2018
comment
ServiceRuntime и диагностика находятся в Azure SDK, а не в пакетах NuGet. - person Frank Shearar; 23.11.2018
comment
Добавление Microsoft.WindowsAzure.Diagnostics в проект исправило это для меня. Я добавил его, щелкнув правой кнопкой мыши папку ссылок проекта в VS, затем «Добавить ссылку», а затем найдя ее в разделе «Расширения», который находится в разделе «Сборки». Путь: C:\Program Files\Microsoft SDK\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Microsoft.WindowsAzure.Diagnostics.dll. Версия 2.8.0.0. Копировать Локальное значение True. - person Brendan L; 13.08.2020