Я получаю очень раздражающую ошибку о нарушении правил безопасности наследования System.Net.Http.Formatting.JsonContractResolver в проекте, использующем PCL.
Вот установка и то, как я отследил проблему.
Проект 1 – Custom.WebApi (портативный, ориентированный на .net 4.5, Core 5.0, Win8, Xamarin.Android, Xamarin.iOS, Xamarin.iOS (классический))
Этот проект является абстракцией над HttpClient для унификации возвращаемых типов Get, Post, Delete,... и зависит ТОЛЬКО от Newtonsoft.Json и .NET с этим профилем.
Мы используем Newtsonsoft.Json pcl версии 6.0.8.($packagesFolder\Newtonsoft.Json.6.0.8\lib\portable-net40+sl5+wp80+win8+wpa81\Newtonsoft.Json.dll)
Проект 2 — Custom.WepApi.Tests (проект модульного тестирования)
Это тестовый проект для проекта WebApi. Он ссылается на полную версию 6.0.8 ($packagesFolder\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll)
Этот проект может запускать тесты для проекта WebApi без проблем.
Проект 3 — MyWebsite (сайт ASP.NET WebApi)
Этот проект представляет собой проект WebApi, в котором типы ответов унифицированы и находятся в проекте Custom.WebApi. Это ссылка на кучу сторонних материалов, а также Newtonsoft.Json v 6.0.8 full ($packagesFolder\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll)
Проект 4 — MyWebsite.Tests
Для тестирования веб-проекта у меня есть тестовый проект, который вызывает конечные точки с помощью реализации Custom.WebApi. Этот проект также ссылается на newtonsoft.json версии 6.0.8. Однако эта ссылка предназначена исключительно для исправления ошибок, наблюдаемых при запуске. Ничто в этом проекте не зависит от Newtonsoft.Json, но если я не добавлю ссылку на него явным образом, произойдет сбой TypeLoadException. Добавление ссылки, похоже, помогает далеко.
Когда я запускаю тесты Project 4, все они терпят неудачу, что указывает на то, что на веб-сайте возникает исключение TypeLoadException при запуске. После тонны расследования я заметил, что при сборке проекта MyWebsite файл Newtonsoft.Json.dll в папке bin перезаписывается переносимой версией и дает сбой.
Если я изменю тестовый проект, чтобы он ссылался на тот же переносимый файл newtonsoft.json.dll, тестовый проект завершится с той же ошибкой. При использовании полной версии ошибок не наблюдается.
Если я вручную заменю dll в папке bin MyWebsite, она снова перезапишется при сборке. Я убедился, что ссылки в файле MyWebsite .csproj верны, включая путь подсказки.
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
Итак, либо мне нужно решить, почему он считает, что существует нарушение правила безопасности наследования (просмотр исходного кода не выявил ничего очевидного о несоответствии модификаторов доступа), либо он должен прекратить перезаписывать Newtonsoft.Json.dll в MyWebsite. папка бин.
Что еще больше усложняет ситуацию, эта замена происходит ИНОГДА. Если я начинаю без отладки, кажется, что это происходит не всегда, и выполнение модульных тестов завершается успешно против развертывания, когда dll не заменяется переносимой версией.