.NET 4.5和带有OVERLAPPED的异步Winsock(非IFS Winsock BSP或LSP)

本文关键字:Winsock IFS LSP BSP 异步 OVERLAPPED NET | 更新日期: 2023-09-27 18:20:03

我正在研究我面临的一个问题,类似于这里提出的问题。这个问题基本上解决了客户端应用程序无法连接到数据库的问题。该决议似乎表明,安装了一个与网络协议不兼容的应用程序,我们应该卸载该应用程序。

根据我的测试,卸载.NET 4.5和加载.NET 4.0也起到了作用,我想找出原因。在研究更多后,我发现以下内容:

.NET 4.5有一个变化,使SQLClient支持异步,正如这篇微软文章,

由于此更改,任何在.NET 4.5中使用OVERLAPPED结构的异步Winsock的应用程序都将导致应用程序无法完成这些Winsock调用。

我对此的反应是,这不被认为是一个.NET 4.5错误吗?

.NET 4.5和带有OVERLAPPED的异步Winsock(非IFS Winsock BSP或LSP)

您可以称之为Windows错误,但它绝对不是.NET或SQL Server错误。

Winsock有两种类型的筛选器驱动程序:IFS和非IFS。IFS驱动程序重用Winsock功能,而非IFS则完全覆盖它。

在WindowsVista之前,异步调用都会得到一个指示立即成功的返回值,并且会得到完成通知。Vista添加了性能增强模式,删除了此冗余通知。IFS驱动程序是免费的,而非IFS驱动现在需要更新以支持它。

因此,您可能会称之为Windows错误,因为您没有维护与不推荐使用的API的向后兼容性。这可能根本不可能,他们的新WFP体系结构取代了它。我想说这更接近于驱动程序错误——你不能说你与Vista兼容,然后忘记实现其中一个API。

无论哪种方式,它都是一个有效的Windows功能,.NET/SQL充分利用它来增加性能是正确的。根据KB2568167,您可以运行此命令来确定到底是什么驱动程序导致了问题:

netsh WinSock Show Catalog

如果服务标志值设置了0x20000位,则提供程序使用IFS处理并将正确工作。如果0x20000位被清除(不是set),则它是非IFS BSP或LSP。

不,这不是.NET中的错误。.NET Framework可以假设底层网络基础设施正常工作。如果安装了一个损坏的WinSock提供程序,那么.NET通常无法访问数据库。

.NET Framework既不负责解决第三方安装软件中的错误,也不可能提供一般的此类行为。