通过VB6或ASP Classic向C#编写的Web服务传参时出现错误
问题根源
你遇到的错误本质是.NET Framework的配置加载规则导致的:类库自身的.dll.config文件不会被运行时主动加载,运行时只会读取当前启动宿主进程的配置文件。在你的场景中,ASP Classic运行在IIS的32位w3wp.exe进程下,.NET运行时会尝试读取w3wp.exe.config而不是你的MyServiceProxy.dll.config,所以就算你把dll.config放到应用目录也无法识别。
解决方案(优先推荐第一种,稳定性最高)
方案1:修改C#类库代码,硬编码SOAP服务端点信息(无需依赖配置文件)
直接在C#的服务调用代码里手动指定端点地址、绑定、契约,完全不用默认读取配置的构造函数,示例代码如下:
// 原默认构造函数会读取配置,替换成手动构造 using System.ServiceModel; using MyServiceProxy; public class MyServiceCaller { public string CallService(string param) { // 手动指定绑定,和你原来配置里的绑定类型一致,比如BasicHttpBinding var binding = new BasicHttpBinding(BasicHttpSecurityMode.None); // 手动指定服务端点地址,替换成你的实际SOAP服务地址 var endpoint = new EndpointAddress("http://你的SOAP服务地址/Service.svc"); // 用带参数的构造函数实例化客户端 using(var client = new ServiceClient(binding, endpoint)) { return client.你的调用方法(param); } } }
修改后重新编译C#类库,重新用Regasm注册,替换原有dll即可,无需再携带.dll.config文件,后续也不会出现配置加载问题。
方案2:给IIS 32位w3wp进程添加配置文件(不推荐,升级IIS或.NET会覆盖)
如果不想改代码,可按以下步骤操作:
- 找到32位IIS进程目录:
C:\Windows\SysWOW64\inetsrv\ - 在该目录下新建名为
w3wp.exe.config的文件,把你MyServiceProxy.dll.config里的全部配置内容复制进去 - 打开IIS管理器,找到你的ASP Classic对应的应用池,重启应用池生效
注意:如果你的应用池是64位的(ASP Classic一般运行在32位应用池,需要确认应用池的「启用32位应用程序」设置为True),则需要把配置文件放到
C:\Windows\System32\inetsrv\目录下
额外验证步骤
操作完成后按以下顺序验证:
- 先重新注册C#类库:运行
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\regasm.exe /codebase /tlb 你的C#dll路径\MyServiceProxy.dll,注意要使用32位的regasm,不要用64位的Framework64目录下的版本 - 重新给VB6项目引用新生成的tlb文件,重新编译VB6的dll,重新在组件服务注册
- 清理浏览器缓存,重启ASP测试页面验证
内容的提问来源于stack exchange,提问作者Jose Rosales
相关产品推荐
相关产品推荐

