Не удалось загрузить тип ServiceStack.ServiceHost.IService при запуске ServiceStack

Я получаю вышеуказанную ошибку при вызове Init() в моем AppHost.

Это чистое веб-приложение asp.net v 4.5 с простой службой HelloWorld в соответствии с учебным пособием по началу работы.

Я использую более старую версию ServiceStack, установленную с помощью:

Install-Package ServiceStack -Version 3.9.71

Что устанавливает ссылки на:

ServiceStack.dll 3.9.70.0
ServiceStack.Common.dll 3.9.9.0
ServiceStack.Interfaces.dll 3.9.9.0
ServiceStack.OrmLite.dll 3.9.14.0
ServiceStack.OrmLite.SqlServer.dll 1.0.0.0
ServiceStack.Redis.dll 3.9.11.0
ServiceStack.ServiceInterface.dll 3.9.70.0
ServiceStack.Text.dll 4.0.11.0

И я получаю ошибку:

[TypeLoadException: Could not load type 'ServiceStack.ServiceHost.IService' from assembly 'ServiceStack.Interfaces, Version=3.9.9.0, Culture=neutral, PublicKeyToken=null'.]
   Falck.WebAPI.AppHost..ctor() in c:\inetpub\wwwroot\WebAPI\Falck.WebAPI\Global.asax.cs:17
   Falck.WebAPI.Global.Application_Start(Object sender, EventArgs e) in c:\inetpub\wwwroot\WebAPI\Falck.WebAPI\Global.asax.cs:29

[HttpException (0x80004005): Could not load type 'ServiceStack.ServiceHost.IService' from assembly 'ServiceStack.Interfaces, Version=3.9.9.0, Culture=neutral, PublicKeyToken=null'.]
   System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +9865825
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +118
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +172
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +336
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +296

[HttpException (0x80004005): Could not load type 'ServiceStack.ServiceHost.IService' from assembly 'ServiceStack.Interfaces, Version=3.9.9.0, Culture=neutral, PublicKeyToken=null'.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9880168
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +101
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +254

В нем говорится, что он не может загрузить тип, но я понятия не имею, почему?

Ниже представлен вывод nuget:

Package Manager Console Host Version 2.8.50126.400

Type 'get-help NuGet' to see all available NuGet commands.

PM> Install-Package ServiceStack -Version 3.9.71
Attempting to resolve dependency 'ServiceStack.Common (≥ 3.0 && < 4.0)'.
Attempting to resolve dependency 'ServiceStack.Text'.
Attempting to resolve dependency 'ServiceStack.Redis (≥ 3.0 && < 4.0)'.
Attempting to resolve dependency 'ServiceStack.OrmLite.SqlServer (≥ 3.0 && < 4.0)'.
Installing 'ServiceStack.Text 4.0.11'.
You are downloading ServiceStack.Text from Service Stack, the license agreement to which is available at https://servicestack.net/terms. Check the package for additional dependencies, which may come with their own license agreement(s). Your use of the package and dependencies constitutes your acceptance of their license agreements. If you do not accept the license agreement(s), then delete the relevant components from your device.
Successfully installed 'ServiceStack.Text 4.0.11'.
Installing 'ServiceStack.Common 3.9.11'.
Successfully installed 'ServiceStack.Common 3.9.11'.
Installing 'ServiceStack.Redis 3.9.11'.
Successfully installed 'ServiceStack.Redis 3.9.11'.
Installing 'ServiceStack.OrmLite.SqlServer 3.9.14'.
Successfully installed 'ServiceStack.OrmLite.SqlServer 3.9.14'.
Installing 'ServiceStack 3.9.71'.
Successfully installed 'ServiceStack 3.9.71'.
Adding 'ServiceStack.Text 4.0.11' to Falck.WebAPI.
Successfully added 'ServiceStack.Text 4.0.11' to Falck.WebAPI.
Adding 'ServiceStack.Common 3.9.11' to Falck.WebAPI.
Successfully added 'ServiceStack.Common 3.9.11' to Falck.WebAPI.
Adding 'ServiceStack.Redis 3.9.11' to Falck.WebAPI.
Successfully added 'ServiceStack.Redis 3.9.11' to Falck.WebAPI.
Adding 'ServiceStack.OrmLite.SqlServer 3.9.14' to Falck.WebAPI.
Successfully added 'ServiceStack.OrmLite.SqlServer 3.9.14' to Falck.WebAPI.
Adding 'ServiceStack 3.9.71' to Falck.WebAPI.
Successfully added 'ServiceStack 3.9.71' to Falck.WebAPI.

Ответ 1

Это измененное изменение (с хорошими намерениями) в версии NuGet 2.8. Я подозреваю, что @Scott работает версии 2.7 или ниже NuGet.

TL;DR;

Чтобы решить проблему, добавьте -DependencyVersion Highest в команду install-package на консоли управления пакетами в Visual Studio. Полная команда читает:

Install-Package ServiceStack -Version 3.9.71 -DependencyVersion Highest

Подробный ответ

В примечаниях к выпуску версии NuGet 2.8 изменено разрешение зависимостей.

В старой версии были найдены младшие основные и второстепенные версии, которые удовлетворяли зависимости, а затем загрузили самую высокую версию патча. Обоснованием для этого было то, что версии патчей предполагаются для исправлений ошибок и не вносят никаких изменений.

Но разработчики пакетов были разработчиками пакетов, некоторые "патч-версии" пакетов действительно вносили изменения, поэтому разные разработчики, устанавливающие пакеты в разное время, получали разные пакеты.

Версия 2.8 NuGet пытается решить эту проблему, также вытаскивая самую низкую версию патча, которая удовлетворяет критериям. Это разрывает ServiceStack и, возможно, целый ряд других пакетов.

ServiceStack имеет зависимость от ServiceStack.Common( >= 3.0 & < 4.0).
В старые времена (NuGet 2.7), это потянет в версию 3.9.71 ServiceStack.Common(самый высокий доступный номер патча), но теперь он тянет в 3.9.11 (самая низкая версия патча на 3,9 мажор/малая версия).

ServiceStack.Common v3.9.11 вообще не имеет ограничений по версиям на своих зависимостях, поэтому использует версии других версий, включая свою собственную зависимость, ServiceStack.Text версии 4. (коммерчески лицензированные!).

К счастью, NuGet включает в себя переключатель командной строки, чтобы вернуться к старому поведению. Подробная информация об этом содержится в примечаниях к выпуску (связанных в разделе tl; dr; выше). В этом конкретном случае добавление -DependencyVersion Highest получит наивысшие версии основных, второстепенных и исправлений, которые удовлетворяют ограничению, то есть версии 3.9.71 вытягиваются по всей доске.

Ответ 2

Я столкнулся с той же проблемой и перешел к тому, что сказал Скотт 02/25, я использовал следующее в консоли диспетчера пакетов:

Install-Package ServiceStack -Version 3.9.71 -IgnoreDependencies
Install-Package ServiceStack.Common -Version 3.9.71 -IgnoreDependencies
Install-Package ServiceStack.OrmLite.SqlServer -Version 3.9.71 -IgnoreDependencies
Install-Package ServiceStack.Redis -Version 3.9.71 -IgnoreDependencies
Install-Package ServiceStack.Text -Version 3.9.71 -IgnoreDependencies

Это удалось устранить проблему.

Ответ 3

Ваша установка пакета NuGet очень неверна; что кажется странным, поскольку я запускаю NuGet и получаю правильные пакеты и версии.

Запуск Install-Package ServiceStack -Version 3.9.71 должен установить следующие пакеты, содержащие следующие версии dll с версией:

  • ServiceStack 3.9.71

    ServiceStack.dll 3.9.71
    ServiceStack.ServiceInterface.dll 3.9.71

  • ServiceStack.Common 3.9.71

    ServiceStack.Common.dll 3.9.71
    ServiceStack.Interfaces.dll 1.0.0

  • ServiceStack.Redis 3.9.71

    ServiceStack.Redis.dll 3.9.71

  • ServiceStack.OrmLite.SqlServer 3.9.71

    ServiceStack.OrmLite.dll 3.9.71
    ServiceStack.OrmLite.SqlServer.dll 3.9.71

  • ServiceStack.Text 3.9.71

    ServiceStack.Text.dll 3.9.71

Предложение:

  • Удалите все ссылки из вашего проекта.
  • Удалите packages.config.
  • Проверить цель проекта .NET 4.5.
  • Очистите проект.
  • Затем заново запустите команду NuGet.

Ответ 4

удалите ссылку Servicestack.Text и запустите

Install-Package ServiceStack.Text -Version 3.9.71

также удалите ссылку ServiceStack.Common и запустите

Install-Package ServiceStack.Common -Version 3.9.71