我有一个包含多个WAP的解决方案(Web应用程序项目(
每个WAP都有自己的WebDeploy项目,以便能够预编译这些网站。在一个web应用程序上,我们创建了一个带有的新WCF文件
AspNetCompatibilityRequirementsMode.Allowed
在调试模式下,它工作正常,但如果我切换到释放它,它就会崩溃:
(我们正在使用msbuild创建可部署版本(
无法加载文件或程序集"App_Web_*****,版本=0.0.0.0,Culture=neutral、PublicKeyToken=null或其依赖项之一。这个系统找不到指定的文件。
我在这个链接中找到了一些解释:WCF服务
WCF将引用程序集的列表存储到customString中属性(service.svc.cdcab7d2.已编译(,包括App_Global。这里似乎有一个错误的假设这些程序集将始终存在,这并不一定Web部署项目(aspnet_merge(中程序集所在的情况将被合并。在合并步骤之后,程序集实际上是合并为一个程序集(比如MyWebSite.dll(在WDP中选择了该选项。ASP.NET仅更新已编译的文件它知道,所以App_Global.asax.com.stacked实际上有一个正确的引用MyWebSite_Deploy.dll而不是App_Global.dll。原始程序集在合并步骤之后被删除。WCF读取的列表以前存储的程序集,并在找不到时引发应用程序全局
我尝试过的解决方案列表:
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
其他信息
服务位于:ProjectNameWebResorceService.svc
,
<%@ ServiceHost ... Factory="SolutionName.SharedWeb.WadoLabsServiceHostFactory" %>
其中SharedWeb是一个共享Web项目
你还有其他想法吗
提前感谢
以下设置对我有效:
- 在svc文件中,指定服务的合格名称,如
<%@ ServiceHost ... Service="<Namespace>.<ServiceContractClass>, <AssemblyName>" CodeBehind="ServiceContractClass.svc.vb" %>
- (记不清为什么需要它,但(我确保Namespace和AssemblyName不同
诀窍是指定限定名称,包括AssetyName。(在包含服务的项目中指定的程序集名称,而不是Web Deploy项目(。
还要注意,类名后面的逗号和AssemblyName之间有一个空格。
为什么不在同一解决方案中的单独库项目中实现WCF服务,并简单地从web应用程序中引用该项目?这样,它们将不在预编译过程中,并且您可以在*.svc文件中使用可预测的类型名。此外,这可能也会给你一个更清洁的解决方案结构。