预编译Web应用程序中的WCF服务 - 无法加载文件或程序集

时间:2011-08-04 14:28:09

标签: asp.net vb.net wcf assemblies precompiled

我有一个包含多个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项目

你有其他想法吗?
提前谢谢你

2 个答案:

答案 0 :(得分:1)

为什么不在同一解决方案中的单独库项目中实现WCF服务,只需从您的Web应用程序引用该项目?这样他们就会停止在预编译过程之外,你可以在* .svc文件中使用可预测的类型名称。另外,这可能也会为您提供更清洁的解决方案结构。

答案 1 :(得分:1)

以下设置对我有用:

  1. 在svc文件中,指定服务的限定名称,为<%@ ServiceHost ... Service="<Namespace>.<ServiceContractClass>, <AssemblyName>" CodeBehind="ServiceContractClass.svc.vb" %>
  2. (不记得为什么需要它,但是)我确保命名空间和AssemblyName不同。
  3. 诀窍是指定限定名称,包括AsseblyName。(包含服务的项目中指定的程序集名称,而不是Web Deploy项目。)

    另请注意,类名后面的逗号和AssemblyName之间有一个空格。