将WCF服务加入IIS托管网站后遇服务激活异常求助
这是WCF部署到IIS时很常见的类型加载问题,我帮你梳理几个关键排查点,按顺序尝试应该能解决:
确保服务程序集已部署到网站bin目录
你的WCF服务是独立解决方案,编译后会生成AWL.AI.WWIP.dll(及配套pdb文件),必须把这个dll复制到网站根目录的bin文件夹下——只把服务代码文件夹放到网站目录是不够的,IIS需要从bin目录加载服务的程序集,找不到dll自然会提示类型不存在。核对.svc文件中的ServiceHost指令
打开testservice.svc文件,检查第一行的Service属性值是否完全准确,比如:<%@ ServiceHost Language="C#" Debug="true" Service="AWL.AI.WWIP.SBLPayService" CodeBehind="testservice.svc.cs" %>要严格匹配命名空间、类名的大小写和拼写,确保和服务项目里的类完全一致,别出现多余空格或拼写错误。
检查web.config中的服务激活配置
如果你的服务是通过web.config的serviceActivations节点配置激活的,要确保type属性格式正确,必须包含类名+程序集名称,比如:<serviceActivations> <add relativeAddress="./services/testservice.svc" service="AWL.AI.WWIP.SBLPayService, AWL.AI.WWIP" /> </serviceActivations>这里的
AWL.AI.WWIP是程序集名称(即dll去掉后缀的名字),绝对不能省略,否则IIS不知道去哪里查找这个类型。验证.NET版本兼容性
检查网站应用程序池的.NET CLR版本,确保和WCF服务项目的目标框架版本一致。比如服务用的是.NET Framework 4.8,而网站应用程序池设置的是4.0,就会导致程序集加载失败。可以在IIS管理器中找到对应应用程序池,右键「高级设置」查看并调整版本。确认WCF处理程序映射已注册
有时候IIS没正确注册WCF的.svc处理程序,导致无法解析服务请求。你可以在IIS管理器中进入网站的「处理程序映射」,查看是否有.svc对应的处理程序(名称通常是svc-Integrated或svc-ISAPI-4.0_xxxx)。如果没有,以管理员身份打开命令提示符,运行对应.NET版本的注册命令:%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i64位系统可以改用
Framework64目录下的命令。检查程序集权限和加载状态
偶尔会出现应用程序池身份没有读取bin目录dll的权限,或者dll被文件锁定的情况。你可以给网站根目录的bin文件夹添加应用程序池身份(比如IIS AppPool\你的应用程序池名称)的读取权限,然后重启应用程序池,让IIS重新加载程序集。
按上面的步骤逐一排查,应该能解决类型找不到的问题。
内容的提问来源于stack exchange,提问作者NewTech

