我有一个包含多个 WAP(Web 应用程序项目)的解决方案。
每个 WAP 都有自己的Web Deploy 项目,以便能够预编译这些站点。在其中一个 Web 应用程序上,我们创建了一个新的 WCF 文件
AspNetCompatibilityRequirementsMode.Allowed
在调试模式下它工作正常,但如果我切换到发布它会崩溃:(
我们正在使用 msbuild 创建可部署版本)
无法加载文件或程序集“App_Web_*****,版本=0.0.0.0,文化=中性,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。
我在这个链接中找到了一些解释:WCF 服务
WCF 将引用程序集的列表存储到生成结果 (service.svc.cdcab7d2.compiled) 中的 customString 属性中,包括 App_Global。这里似乎有一个不正确的假设,即这些程序集将始终存在,而在将合并程序集的 Web 部署项目 (aspnet_merge) 中不一定是这种情况。在合并步骤之后,由于我们在 WDP 中选择了该选项,因此这些程序集实际上都合并为一个程序集(假设为 MyWebSite.dll)。ASP.NET 只更新它所知道的 .compiled 文件,因此 App_Global.asax.compiled 实际上正确引用了 MyWebSite_Deploy.dll 而不是 App_Global.dll。合并步骤后将删除原始程序集。WCF读取之前存储的程序集列表,找不到App_Global时抛出
我尝试过的解决方案列表:
1.检查'允许此预编译站点可更新' - 无效
2.从 service.compile 文件中手动删除App_* 引用
(它有效,但它应该是另一种解决方案)
3.在 .svc 中为服务/工厂添加
全限定名 服务有全限定名。
4.试图设置这个键:
<SourceWebPhysicalPath>..\..\ProjectName</SourceWebPhysicalPath>
按照这些说明
5.<compilation debug="false" batch="false">
尝试使用这些说明将其设置为 web.config
6.“将所有输出合并到单个程序集”
我没有尝试过,因为它需要将所有使用的程序集注册到 GAC,这意味着我们需要更改部署逻辑。
我不想删除asp.net 临时文件夹,因为它会停止应用程序并且不可接受
我还找到了Scott Gutthrie 链接,但它是从 07 年开始的,它应该成为 asp.net 4.0 的方式
附加信息
服务放置:
ProjectName\WebResorce\Service.svc
,
<%@ ServiceHost ... Factory="SolutionName.SharedWeb.WadoLabsServiceHostFactory" %>
其中SharedWeb是一个 Shared Web 项目
你有什么其他的想法吗?
提前致谢