COM组件是银联B2C的 开放接口组件
本地系统Win7 64,服务器是Server2008 64
本地无异常,在服务器上面组件注册也已成功
请教大神
将 IIS 中对应的应用程序池修改为 32 位。
报错,验证试图MAC失败
@门前有根大呲花: 你是不是应用了群集策略?
@Launcher: 就一台服务器,没有部署群集
@门前有根大呲花: 通过 IIS,给你的网站指定一个固定的 MachineKey。
@Launcher: 我去研究一下,我这个问题的原因有可能是什么呢?是什么可能导致它出现这个问题的呢?
他在我本地就没有这个问题,现在搞不懂的就是不知道哪里出了问题
@门前有根大呲花: 不用研究吧,直接在 IIS 上设置下就行了。你把“验证试图MAC失败”后面的内容都给贴全了,我给你解释。
@Launcher: 我靠啊,怎么刚才用32就报错,看报错之后就改为flase了,现在改过来突然能用了又不报错了,这是什么原因?
@门前有根大呲花: 应用程序池重启后,MachineKey 变了,而客户端提交了一个使用旧的 MachineKey 加密的待验证东东。
@Launcher: 这个问题与这个启用32位应用程序有什么关系吗?为什么会有这个关系呢?
为什么在我本地不会报错呢
@门前有根大呲花: 不要老说本地本地的,你就说调试,还是部署在 IIS 中,只要部署在 IIS 中,都可能遇到这个问题,因为 MachineKey 变动了,而页面保留了使用旧的 MachineKey 加密的东东。
@Launcher: MachineKey这个值如果没在web.config里面配置的话是什么东西自动创建的?
这个东西是每个网站都必有的东西吗?
@门前有根大呲花:
MachineKey这个值如果没在web.config里面配置的话是什么东西自动创建的? ——〉由 .Net 运行时创建。
这个东西是每个网站都必有的东西吗? ——〉 是。
@Launcher: 下班了去自习研究一下这个machinekey,刚参加工作的不能都像我这么菜吧 那就没希望了
@Launcher: 这个问题与启用32位应用程序有什么关系呢
@门前有根大呲花: 没有直接关系,而是修改设置后,应用程序重启,重新生成了一个新的 MachineKey。
@Launcher: 我说的是那个COM组件 没有注册类的问题与这个启用32位有什么关系呢
@门前有根大呲花: 因为你那个组件是 32 位的。
@Launcher: 那为什么我调试的时候不报错呢?那是不是发布的时候发布成x86的就没有错误了
@门前有根大呲花: 因为 VS 是 32 位的。你可以在发布的时候改成 x86 试试,但是 IIS 应用程序池中的选项可能会对它有影响,所以通常不特别指定,而是在 IIS 的应用程序池的选项中去修改。
@Launcher: 圆满了,剩下的就是我自己研究了,非常感谢,时间对每个人都是宝贵的非常感谢!
建议将错误信息的文字粘贴出来
试试这个方法:在项目属性里设置“生成”=>“目标平台”为x86而不是默认的ANY CPU
方法来自:VS2008在64位Windows平台上编译ArcEngine导致HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)错误的解决办法
@dudu: 用的是vs12发布的,里面没有这个x86的选项,另外服务器是64,还需要改变目标平台吗?
错误信息没有涉及到代码,上图最下面那几行代码就是调用DLL方法的代码,错误还是下面的错误
Retrieving the COM class factory for component with CLSID {522E44BF-7BC9-4135-B5EB-8CC154144B0D} failed due to the following error: 80040154 没有注册类 (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
@门前有根大呲花: 那就把“目标平台”改为x64试试
在博客园看的有的还说是需要重启IIS,我在本地调试时就是安装完组件之后就直接用的,本地VS调试的时候也用到IIS了吗?还是说每启用调试一次就启用一次IIS呢?还真是从没像这方面想过
@门前有根大呲花: 调试的时候用的是IIS Express
@dudu: 那个活动解决方案平台里面只有一个Any CPU,自己键入的可以吗
@门前有根大呲花: 或者试试将IIS应用程序池的帐户改为LocalService或LocalSystem或NetworkService
@dudu: 还是不可以
@dudu: 这个错误与IIS还能有什么关系吗?
注意检查一下编译的调试和调试符号相关选项。不同于托管程序集,非托管dll的调试符号必须与dll完全一致。比如:你可以部署一个release版本的托管程序集同时还附带调试符号,也可以是一个debug版本缺失调试符号文件,甚至调试符号文件和程序集版本不一致都不会报错;但是部署非托管程序时,必须是完全一致,debug版本的dll必须附带同一编译版本的调试符号。如果是混合编译的,那编译选项的不同在调试符号的附带部署上又还会有细微差别(强制一致的要求范围可能扩散到引用的托管程序集)。