我有一个包含多个WAP的解决方案( Web应用程序项目) 每个WAP都有自己的 Web Deploy项目,以便能够预编译这些站点。 在其中一个Web应用程序中,我们使用
创建了一个新的WCF文件AspNetCompatibilityRequirementsMode.Allowed
在调试模式下它工作正常,但如果我切换到释放它崩溃:
(我们使用msbuild创建可部署的版本)
无法加载文件或程序集'App_Web _ *****,Version = 0.0.0.0, Culture = neutral,PublicKeyToken = null'或其依赖项之一。该 系统找不到指定的文件。
我在此链接中找到了一些解释:WCF service
WCF将引用的程序集列表存储到customString中 构建结果中的属性(service.svc.cdcab7d2.compiled), 包括App_Global。这里似乎有一个不正确的假设 那些集会将永远存在,这不一定 Web部署项目(aspnet_merge)中汇编的情况 将被合并。合并步骤之后,程序集实际上都是 合并为一个程序集(让我们说MyWebSite.dll)就像我们一样 在WDP中选择了该选项。 ASP.NET仅更新.compiled文件 它知道,所以App_Global.asax.compiled实际上是正确的 引用MyWebSite_Deploy.dll而不是App_Global.dll。原版的 合并步骤后删除程序集。 WCF读取列表 先前存储的程序集,并在找不到时抛出 App_Global
我尝试过的解决方案列表:
1.检查'允许此预编译网站可更新' - 无法使用
2. Remove manualy来自service.compile文件的App_ *引用
(虽然有效,但它应该是另一种解决方案)
3.在.svc中添加服务/工厂的完全限定名称 该服务具有完全限定的名称。
4.设置此键:
<SourceWebPhysicalPath>..\..\ProjectName</SourceWebPhysicalPath>
遵循these说明
5。<compilation debug="false" batch="false">
尝试使用these说明
设置为web.config 6.“将所有输出合并到单个程序集”
我没有尝试过这个,因为它需要将所有使用过的程序集注册到GAC,这意味着我们需要更改部署逻辑。
我不想删除the asp.net temporary folder因为它停止了应用程序并且它是不可接受的
我还发现了Scott Gutthrie link,但它来自'07它应该是通往asp.net 4.0的方式
其他信息
该服务的位置为:ProjectName\WebResorce\Service.svc
,
<%@ ServiceHost ... Factory="SolutionName.SharedWeb.WadoLabsServiceHostFactory" %>
其中 SharedWeb 是共享Web项目
你有其他想法吗?
提前谢谢你
答案 0 :(得分:1)
为什么不在同一解决方案中的单独库项目中实现WCF服务,只需从您的Web应用程序引用该项目?这样他们就会停止在预编译过程之外,你可以在* .svc文件中使用可预测的类型名称。另外,这可能也会为您提供更清洁的解决方案结构。
答案 1 :(得分:1)
以下设置对我有用:
<%@ ServiceHost ... Service="<Namespace>.<ServiceContractClass>, <AssemblyName>" CodeBehind="ServiceContractClass.svc.vb" %>
诀窍是指定限定名称,包括AsseblyName。(包含服务的项目中指定的程序集名称,而不是Web Deploy项目。)
另请注意,类名后面的逗号和AssemblyName之间有一个空格。