1

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

你有什么其他的想法吗?
提前致谢

4

2 回答 2

1

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

于 2011-08-04T18:05:11.010 回答
1

以下设置对我有用:

  1. 在 svc 文件中,指定服务的限定名称,如<%@ ServiceHost ... Service="<Namespace>.<ServiceContractClass>, <AssemblyName>" CodeBehind="ServiceContractClass.svc.vb" %>
  2. (不记得为什么需要它,但是)我确保 Namespace 和 AssemblyName 是不同的。

诀窍是指定限定名称,包括 AsseblyName。(在包含服务的项目中指定的程序集名称,而不是 Web 部署项目)。

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

于 2016-10-20T12:05:17.807 回答