服务器上安装了MySQL后,发现某些ASP.NET网站打开会出现machine.config配置错误,后来在解决问题的过程中发现,这可能是MySQL的一个BUG,不过倒是有解决的方法,国外很多猿类也遇到这个问题,经过我的研究整理出了几个解决方法,都是十分有效的,主要还是和MySQL Connector/NET这个驱动程序有关系!
先贴下具体的错误信息和截图:
“/”应用程序中的服务器错误。
配置错误
说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。
分析器错误消息: Unable to connect to any of the specified MySQL hosts.
源错误:
行 284: <siteMap>
行 285: <providers>
行 286: <add name="MySqlSiteMapProvider" type="MySql.Web.SiteMap.MySqlSiteMapProvider, MySql.Web, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="LocalMySqlServer" applicationName="/" />
行 287: </providers>
行 288: </siteMap>
源文件: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config 行: 286
版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.6.1055.0
先简单分析下错误信息,其实可以很直观看出问题出在machine.config中name="MySqlSiteMapProvider"这个节点。这个配置是具体是干啥的我也说不清楚,也是比较懒没去研究。稍微排查下发现在安装MySQL Connector/NET驱动程序时,会自动在machine.config加上这段配置。可以通过web平台安装程序检查下,肯定能找到这个驱动程序:
也可以通过控制面板的卸载或更改程序找到:
接下来直接列举我整理出的三个解决方法。
这个方法我比较推荐使用,主要是非常安全,不会影响到IIS上其他网站。在不能随便改动服务器相关配置的情况下十分合适。只要在出问题的网站中,通过在web.config的system.web节点下添加如下配置即可:
<siteMap>
<providers>
<removename="MySqlSiteMapProvider"/>
</providers>
</siteMap>
另外要注意siteMap和providers节点是否存在,如果存在直接添加
<removename="MySqlSiteMapProvider"/>
最后重新启动网站并刷新页面测试下。这种解决方法属于自立自强型,强制排除掉machine.config错误配置的干扰。如果其他网站也有相同问题,依然要按照这个步骤移除错误的配置节点。
这里有四个可供参考的资料:
首先可以肯定的是,这个问题就是由Web Providers功能引起的,删除和禁用后问题解决,可以发现machine.config中出错的配置都会自动删除。
打开控制面板,进入卸载和更改程序的操作界面,如下图所示找到MySQL Connector Net,右键打开选择菜单,点击更改:
在更改界面中将Web Providers禁用掉,点击NEXT并完成剩下的步骤:
这种方法比较粗糙,注意的地方和方法二一样,一般来说涉及到系统层面的配置修改都要小心,否则会引发一连串的问题。
另外还要注意32位和64位系统的差别,对应的machine.config位置如下:
打开machine.config配置文件,并删除如下图中红框里的节点即可(谨慎点可以先注释!):
还有建议看下这个帖子,对这个问题很多人都提出了解决方法和自己的见解:ERROR: Unable to connect to any of the specified MySQL hosts.
最后额外提及一个MySql.Web.v20的问题,具体错误和本文提到的问题类似,刚兴趣的朋友可以到MYSQL官网资料查看:Bug #74080
国外也有个哥们也遇到这个问题并写了博客:C# with MySQL Error(2018/04/07 备注:博客已经打不开了)
作者:十有三
出处:https://shiyousan.com/post/636150861315103167
版权声明:本文采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请声明出处或保留此段声明。