【问题标题】:WCF service in a precompiled web application - Could not load file or assembly预编译的 Web 应用程序中的 WCF 服务 - 无法加载文件或程序集
【发布时间】:2011-08-04 14:28:08
【问题描述】:

我有一个包含多个 WAP(Web 应用程序项目)的解决方案。
每个 WAP 都有自己的Web 部署项目,以便能够预编译这些站点。 在其中一个 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。听起来它对您有用,对我也有用。您可以通过编写表示服务的占位符文本文件的转换脚本来自动执行此操作。由于该文件是一个占位符,因此我通过不在每个版本的服务器上替换它来处理它。
  • 你自动化了吗?如果有,你是怎么做到的?
  • 不,我没有自动化它。无论如何,我想避免重新发布占位符文件。这让我可以最大限度地减少在发布期间实际必须移动的文件数量。所以是的,我不得不手动更改每个服务文件一次(我只有几个),但对于后续版本,我不需要担心。

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


【解决方案1】:

以下设置对我有用:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这绝对是一个选项,因为我们正在考虑这种变化,但这并不能解决短期内的实际问题。
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多