我们在Windows服务中托管了现有的WCF服务。该服务已针对.NET Framework 4.0构建和部署。
几天前,我们安装了.NET Framework 4.6.1。该服务器以前具有.NET Framework 4.0。
我们现在看到该服务产生的异常。我已经包含了下面的异常详细信息以及FillProcessorNetTcpBinding类的代码。
似乎.NET升级以一种不向后兼容.NET 4.0的方式更新了一些程序集。我们的目标是像以前一样拥有预先部署的服务功能,而无需针对.NET 4.6.1。
为什么在应用程序面向.NET 4.0时使用.NET 4.5+程序集?
有什么建议吗?
<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>
答案 0 :(得分:0)
我认为如果您使用System.Net.WebSockets.WebSocket
类型,那么您必须至少定位.NET 4.5,因为您写道:
直到.NET 4.5才引入
System.Net.WebSockets.WebSocket
,因此对于面向.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.0时使用.NET 4.5类型时可以成功构建解决方案?
答案 1 :(得分:0)
.Net 4.5 / 4.6是就地更新,即更新会使用较新的位替换计算机上的4.0程序集。您的应用程序仍然可以定位4.0并获得4.0行为,但在引擎盖下它将使用4.5 / 4.6程序集。
你得到的错误很奇怪。您的计算机上的WCF程序集似乎已更新为4.6,而System.dll则不是。你能检查一下System.dll的版本,看它是否升级了吗?它应该升级。如果不是,可能重新安装框架或重启机器可能有所帮助。
答案 2 :(得分:0)
正如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安装程序regkeys,并且您认为已在计算机上安装了.NET v4.6.1。请在http://connect.microsoft.com/处打开一个问题,其中包含详细的安装步骤以及上面的文件版本和regkeys值信息。
2.您的计算机具有正确的.NET V4.6.1文件版本和设置regkeys,但是,您仍然可以重现问题。请使用repro程序在http://connect.microsoft.com/打开一个问题,并提供文件版本和设置regkey信息。我们会做进一步的调查。