本文档介绍从 .NET Framework 版本 3.5 升级到 .NET Framework 版本 3.5 Service Pack 1(SP1)时,可能需要在应用程序或环境中考虑的设计更改。
发生更改的原因有多种,包括针对产品问题、标准合规性、客户反馈和安全性的修复。 本主题仅介绍值得注意的更改。 有关新功能的信息,请参阅 .NET Framework 中的
以下部分介绍 .NET Framework 版本 3.5 SP1 中所做的更改。
公共语言运行时
性能改进 应用程序现在使用数据执行防护来防止尝试插入和执行来自非可执行内存位置的代码。 托管代码执行(包括 MSIL 程序集、NGen 映像和非托管代码)的安全性得到了地址空间布局随机化(ASLR)支持。 强名称签名的已签名程序集不再需要在加载时检查签名,前提是它们完全受信任,并加载到完全受信任的应用程序域中。 此更改消除了冗余检查,并改进了已签名程序集但未安装在全局程序集缓存(GAC)中的应用程序的启动性能。 从网络共享启动的应用程序的行为与非托管可执行文件的行为相同,并完全信任地运行,而不是部分信任。 现在忽略 StringFreezingAttribute 属性。 此属性用于使用本机映像生成器(Ngen.exe)创建本机映像。 实时 (JIT) 编译器的内联已显著改进,以生成更高质量的代码。 但是,更改内联器会影响使用 TypeAttributes.BeforeFieldInit 枚举值的构造函数实例化类的应用程序。 在访问任何静态字段之前,可以保证在访问任何静态字段之前,而不是在调用静态方法或实例构造函数之前进行这些类型的静态初始化。 在 .NET Framework 版本 3.5 和 3.5 SP1 中,调用类构造函数的确切时间可能有所不同。 其他 JIT 编译器更改包括对浮点舍入错误的更改,以及终结器的计时更改。 无需进行任何修改。 |
ADO.NET
值序列化程序类上的 System.Windows.Converters 命名空间中值序列化程序类上的 CanConvertToString 方法引发 ArgumentException,而不是返回 false。 System.Data.SqlClient.SQLDataReader.GetString 和 oth er Get 方法会引发 InvalidCastException(如果无法将数据强制转换为所请求的类型)。 消息现在包括类型,例如:“无法将类型”System.Decimal“的对象强制转换为类型”System.String”。 无需进行任何修改。 |
UDT 列上的 SQLDataReader.GetString 对用户定义的类型 (UDT) 列调用 SQLDataReader.GetString 方法现在会引发 InvalidCastException,而不是错误消息“从 Byte[] 强制转换为字符串”。 无需进行任何修改。 |
C#
ASP.NET、IIS
IIS 集成模式 在 Internet Information Services (IIS) 7.0 的集成模式下,HttpServerUtility.TransferRequest 方法错误地使用 HTTPResponse.End 方法停止父请求。 这会导致引发 ThreadAbortException,这可能会影响终止响应执行的性能。 在 .NET Framework 3.5 SP1 中,TransferRequest 方法现在使用 HttpApplication.CompleteRequest 方法结束父请求。 这还会通过将控制权传输到 HttpApplication.EndRequest 事件处理程序来正常终止当前请求,而不会引发异常。 建议的修改:如果你有使用 TransferRequest 方法来确定是否引发了 ThreadAbortException 的错误处理代码,则可以从 catch 块中删除该代码。 (最后,块将继续运行。 |
集成 Windows 身份验证 安全更改会影响 System.Net.HttpWebRequest、System.Net.HttpListener、System.Net.Security.NegotiateStream 以及 System.Net 命名空间中相关类处理集成 Windows 身份验证的方式。 此更改可能会影响配置为使用集成 Windows 身份验证的 Web 服务器和客户端应用程序。 与集成 Windows 身份验证一起使用的 Microsoft Windows NT LAN Manager (NTLM) 身份验证过程包括目标计算机发出的质询,该质询将发回客户端计算机。 当计算机收到生成自身质询时,除非连接是环回连接(例如 IPv4 地址 127.0.0.1),否则身份验证将失败。 HttpWebRequest 类现在默认指定 NTLM 身份验证过程中使用的服务主体名称(SPN)的请求 URL 中使用的主机名。 建议的修改:可以在对 URI 编制索引的字符串字典进行身份验证期间使用的自定义 SPN。 此字典使用 System.Net.AuthenticationManager.CustomTargetNameDictionary 属性获取。 还可以添加以下注册表设置,将名称映射到环回连接:
|
CDOSYS System.Web.Mail 命名空间中的类依赖于 Windows 2000 组件的协作数据对象,该组件在下一版本的 Windows(Windows 7)中不可用。 因此,在 Windows 7 中使用这些类将引发 PlatformNotSupportedException。 建议的修改:.NET Framework 版本 2.0 中弃用了 System.Web.Mail。 请改用 System.Net.Mail 命名空间中的邮件支持。 |
ASP.NET 请求验证 ASP.NET 请求验证现在包括检查左尖括号和问号字符序列: Su ggested Modifications:此更改的影响应最小,因为通常没有理由将 XML 注释包含在 Cookie 变量的查询字符串中。 |
URL 验证 ASP.NET 现在从 ASP.NET 页面访问时验证 URL 的某些部分。 但是,使用 URL 重写时,可以使用 Request.RawUrl 属性访问页面上的旧版 URL。 建议的修改:如有必要,请在页面上禁用验证。 |
会话状态 会话状态提供程序应实现在 System.Web.SessionState.SessionStateStoreProviderBase 类上定义的所有成员,包括 CreateUninitializedItem 方法。 但是,仅当站点正在使用无 Cookie 会话状态时,才调用此方法。 未使用无 Cookie 会话状态的开发人员不必在自定义提供程序中实现 CreateUninitializedItem。 随着 .NET Framework 3.5 SP1 的发布,CreateUninitializedItem 方法现在也可以在使用 cookied 会话状态时调用。 建议的修改:在自定义提供程序中实现 CreateUninitializedItem。 确定指定的会话 ID 中是否已存在“实时”项。 如果某个项不存在,提供程序应为会话 ID 创建一个项。 |
URL 编码 ASP.NET 现在扩展出站 HTTP 标头的 URL 编码,以包括删除字符(7F)和所有 ASCII 控制字符(水平选项卡除外)。 建议的修改:如果需要,可以关闭默认标头编码行为,如下所示:
|
在 IIS 上 尽管集成模式应用程序的 System.Web.DefaultHTTPHandler 类在 IIS 7.0 中已过时,但仍可以使用。 现在,它会引发 PlatformNotSupported 异常。 建议的修改:更改应用程序配置以在集成模式下正常工作。 |
服务器和客户端编号格式设置一致性
Number.localeFormat 函数(在客户端上运行)的格式设置行为现在符合 String.Format 方法(在服务器上运行)。 例如,以下代码返回
在 .NET Framework 3.5 SP1 之前,以下代码将返回
现在,localeFormat 返回 无需进行任何修改。 |
隐藏的 ASP.NET 字段(如 VIEWSTATE)现在呈现在呈现任何控件之前 建议的修改:I f 需要,可以通过将新的 renderAllHiddenFieldsAtTopOfForm 属性设置为 false 来关闭此行为: 默认值为 true。 |
Windows Presentation Foundation (WPF)
BitmapEffect 类已过时 System.Windows.Media.Effects.BitmapEffect 类, 及其派生类(BevelBitmapEffect、BitmapEffectGroup、BlurBitmapEffect、DropShadowBitmapEffect、EmbossBitmapEffect和 OuterGlowBitmapEffect)现已过时。 建议的修改:停止使用旧版 BitmapEffect 和派生类,而是使用派生自 Effect的新类:BlurEffect、DropShadowEffect和 ShaderEffect。 还可以通过派生自 ShaderEffect来创建自己的效果。 |
程序集名称更改 包含 WPF 核心呈现层的程序集已从 milcore.dll 重命名为 wpfgfx_v0300.dll。 此程序集从未拥有任何公共 API。 无需进行任何修改。 |
超链接行为 如果 Hyperlink.NavigateUri 属性的值在用户将鼠标光标悬停在超链接上以及用户单击该超链接的时间之间发生更改,则导航将使用光标悬停在超链接上时获取的 URI 进行导航。 无需进行任何修改。 |
在 Windows Vista 上的受保护模式下 当 Internet Explorer 处于 Windows Vista 上的受保护模式时,DHTML 警报() 函数和 HTML 中托管的 ActiveX 控件的模式对话框将被阻止,而不是显示。 此外,当承载 HTML 的 WebBrowser 控件或 Frame 控件位于 XMAL 浏览器应用程序(XBAP)中并且 XBAP 在 HTML 页面中跨域加载时,将引发异常。 无需进行任何修改。 |
值序列化程序类上的 CanConvertToStringSystem.Windows.Media.Converters 中的值序列化程序类 和 System.Windows.Media.Media3D.Converters 命名空间引发 ArgumentException,而不是返回 false。 无需进行任何修改。 |
Windows Communication Foundation (WCF) 和 Windows Workflow Foundation (WF)
架构匹配 UriTemplate 和 UriTemplateTable 类使用的架构匹配方案已放宽,以接受除 HTTP 以外的方案的基本地址。 现在,当候选 URI 与模板匹配时,这两个类都没有使用方案或端口号。 添加了对尾部斜杠和默认值的模板支持。 无需进行任何修改。 |
身份验证 的安全改进 当服务在具有混合模式安全性的用户帐户下运行时,EndPointIdentity 必须具有用户主体名称(UPN)标识。 在早期版本的 WCF 中不需要这样做。 建议的修改:将客户端设置为使用 SecurityMode.TransportWithMessageCredential 设置(使用 Windows 身份验证、UPN 身份验证或指纹身份验证),请使用 UPN 标识创建 EndPointAddress 类的实例,并提供自定义代码来处理任何指纹验证。 |
事件日志记录 的部分信任支持 部分信任现在支持有限的事件日志记录。 仅将服务激活错误、跟踪失败和日志记录失败记录到事件日志中。 为了避免将过多的消息写入事件日志,进程可以记录的最大事件数为 5。 无需进行任何修改。 |
RemoteEndpointMessageProperty 可用性 使用 IIS 中托管的 HTTP 时访问 RemoteEndpointMessageProperty 类的实例取决于当前处于活动状态的请求。 因此,在请求完成后(例如,执行单向接收时)无法获取它。 无需进行任何修改。 |
注意: 若要解决某些应用程序至关重要的后期问题,Microsoft计划提供可能包含在重要 Windows 更新中的 NET Framework 3.5 SP1 更新。 有关此更新的详细信息,请参阅Microsoft下载中心的 .NET Framework 3.5 SP1 下载页。