Не удалось загрузить тип «System.Net.WebSockets.WebSocket» из сборки «Система, версия = 4.0.0.0».

У нас есть существующая служба WCF, размещенная в службе Windows. Служба была создана и развернута для .NET Framework 4.0.

Пару дней назад мы установили .NET Framework 4.6.1. Ранее на сервере была установлена ​​.NET Framework 4.0.

Теперь мы видим исключение, сгенерированное службой. Ниже приведены сведения об исключении, а также код класса FillProcessorNetTcpBinding.

Похоже, что обновление .NET обновило некоторые сборки таким образом, что это не обеспечивает обратной совместимости с .NET 4.0. Наша цель состоит в том, чтобы предварительно развернутая служба функционировала так же, как и раньше, без необходимости ориентироваться на .NET 4.6.1.

Почему используются сборки .NET 4.5+, если приложение ориентировано на .NET 4.0?

Какие-либо предложения?

<TypeLoadException xmlns="http://schemas.datacontract.org/2004/07/System">

<Message>
Could not load type 'System.Net.WebSockets.WebSocket' from assembly 'System, Version=4.0.0.0, Culture=neutral,     PublicKeyToken=b77a5c561934e089'.
</Message>

<Source>
System.ServiceModel
</Source>

<TargetSite>
Boolean get_IsApplicationTargeting45()
</TargetSite>

<StackTrace>
   at System.ServiceModel.OSEnvironmentHelper.get_IsApplicationTargeting45()
   at System.ServiceModel.Channels.ConnectionOrientedTransportBindingElement..ctor()
   at System.ServiceModel.NetTcpBinding.Initialize()
   at System.ServiceModel.NetTcpBinding..ctor()
   at Company.Shared.Processor.Access.WCF.ProcessorNetTcpBinding..ctor() in c:\TeamCity\BuildAgent\work\11b9dc3c2c069bfb\Release    \Main\Shared\Processor\Access\WCF\ProcessorNetTcpBinding.cs:line 12
   at Company.Shared.Processor.Access.WCF.Client.ProcessorServiceClient.CreateTcpEndPoint(String hostName, UInt16 portNumber) in c:\TeamCity\BuildAgent\work\11b9dc3c2c069bfb\Release\Main\Shared\Processor\Access\WCF    \ProcessorServiceClient.cs:line 34
   at Company.shared.Processor.Listener.ListenerManager.CallProcessor(Object msg) in c:\TeamCity\BuildAgent\work\11b9dc3c2c069bfb\Release\Main\Shared\Processor\Listener\Service\ListenerManager.cs:line 212
</StackTrace>

</TypeLoadException>

Класс, на который ссылаются, который расширяет NetTcpBinding

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Security;
using System.ServiceModel;
using System.Text;

namespace Company.Shared.Processor.Access.WCF
{
    public class ProcessorNetTcpBinding : NetTcpBinding
    {
        public ProcessorNetTcpBinding()
        {
            MaxBufferSize = Int32.MaxValue;
            MaxReceivedMessageSize = MaxBufferSize;
            ReaderQuotas.MaxStringContentLength = Int32.MaxValue;
            ReaderQuotas.MaxArrayLength = Int32.MaxValue;
            ReaderQuotas.MaxBytesPerRead = 65536;
            ReaderQuotas.MaxDepth = 64;
            SendTimeout = TimeSpan.FromMinutes(5);

            Security.Mode = SecurityMode.Transport;
            Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
            Security.Transport.ProtectionLevel = ProtectionLevel.Sign;
        }
    }
}

App.config

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="CompanyWcf" type="Company.Shared.Utils.Wcf.Config.WcfConfigSection, Company.Shared.Utils"/>
  </configSections>
    <appSettings>    
    <add key="Company.Shared.Alerting" value="http://Alerting.company.com/api/"/>
    </appSettings>
    <connectionStrings>
      <add name="AlertingDb" connectionString="Data Source=SQLSERVER;Initial Catalog=Company;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
      <add name="OracleConnection" connectionString="Data Source=ODEP;User ID=/;Pooling=false;Connection Timeout=260;" providerName="System.Data.OracleClient" />
      <add name="ThorConnection" connectionString="Data Source=SQLSERVER;Initial Catalog=Thor;Integrated Security=True"/>
    </connectionStrings>
   <!-- Company WCF-->
   <CompanyWcf>
      <Services>
        <add name="Company Processor" host="localhost" port="4329" />
        <add name="Company Processor Listener" host="localhost" port="4330" />
      </Services>
   </CompanyWcf>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

person fatmumuhomer    schedule 11.04.2016    source источник
comment
можете ли вы изменить сборку, чтобы она указывала на .net 4.0..? если код не изменился, но версия .net была обновлена, вы все равно можете понизить версию используемой сборки .net 4.0 vs .net 4.6.x   -  person MethodMan    schedule 11.04.2016
comment
Спасибо за ответ, MethodMan. Версия, создающая исключение, уже предназначена для .NET 4.0. Мы еще не развернули версию, предназначенную для более новой платформы.   -  person fatmumuhomer    schedule 11.04.2016
comment
тогда похоже, что вам нужно будет не только добавить это в раздел использования using System.Net.WebSockets.WebSocket, но вам также нужно будет вручную добавить ссылку на узел ссылок проекта.   -  person MethodMan    schedule 11.04.2016
comment
System.Net.WebSockets.WebSocket не был представлен до .NET 4.5, поэтому он не существует для приложения, ориентированного на .NET 4.0. Мой большой вопрос: почему приложение пытается загрузить сборки .NET 4.5+, когда приложение нацелено на .NET 4.0?   -  person fatmumuhomer    schedule 11.04.2016
comment
нужно было бы увидеть раздел использования вашего заголовка в ваших файлах .cs.. и он также мог быть добавлен в файл .config..   -  person MethodMan    schedule 11.04.2016
comment
Я добавил раздел использования этого файла класса, а также app.config для службы.   -  person fatmumuhomer    schedule 11.04.2016
comment
@fatmumuhomer, какая у тебя версия ОС? Я пытаюсь решить проблему.   -  person X-Mao    schedule 28.04.2016


Ответы (3)


Я думаю, что если вы используете тип System.Net.WebSockets.WebSocket, вам нужно ориентироваться как минимум на .NET 4.5, потому что, как вы написали:

System.Net.WebSockets.WebSocket не было представлено до .NET 4.5, поэтому его не существует для приложения, ориентированного на .NET 4.0.

Это именно то, о чем TypeLoadException. Этот тип не может быть найден в сборке, предназначенной для .NET Framework 4.0.

<Message>
Could not load type 'System.Net.WebSockets.WebSocket' from assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
</Message>

Возникает вопрос: Почему ваше решение может быть успешно построено при использовании типа .NET 4.5 и ориентации на .NET 4.0?

person Gabor    schedule 24.04.2016

.Net 4.5/4.6 — это обновление на месте, т. е. обновление заменяет сборки 4.0 на вашем компьютере более новыми битами. Ваше приложение по-прежнему может ориентироваться на 4.0 и получать поведение 4.0, но под капотом оно будет использовать сборки 4.5/4.6.

Ошибка у вас странная. Похоже, сборки WCF на вашем компьютере были обновлены до версии 4.6, а System.dll — нет. Не могли бы вы проверить версию вашей System.dll и посмотреть, обновлена ​​ли она? Его следует обновить. Если это не так, может помочь переустановка фреймворка или перезагрузка компьютера.

person X-Mao    schedule 28.04.2016

Как указал X-Mao, если вы столкнулись с проблемой, я подозреваю, что проблема может заключаться в установке .NET Framework на вашем компьютере. Если вы предприняли шаги, предложенные X-Mao, но проблема не устранена. Это может быть две возможные причины: 1. Проблема с установкой .NET Framework все еще существует. Пожалуйста, проверьте следующее: Проверьте версии файлов System.dll и system.servicemodel.dll. Версия файла должна быть примерно 4.6.1055.0. Проверьте реестр вашего компьютера (используя Regedit.exe), он должен иметь следующие записи: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client] "Version"="4.6.01055" "TargetVersion"="4.0.0" "Install"=dword:00000001 "InstallPath"="C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\" "Release"=dword:0006041f Если на вашем компьютере другая версия файла или установочные ключи .NET Framework, и вы считаете, что на компьютере установлен .NET v4.6.1 . Пожалуйста, откройте вопрос на http://connect.microsoft.com/ с подробными инструкциями по установке и приведенной выше версией файла и информация о значениях regkeys. 2. На вашем компьютере установлены правильные версии файлов .NET V4.6.1 и установочные regkeys, однако вы все равно можете воспроизвести проблему. Пожалуйста, откройте вопрос на http://connect.microsoft.com/ с программой воспроизведения, версиями файлов и настройками. информация о регке. Мы проведем дополнительное расследование.

person Alicial    schedule 06.05.2016