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



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

你还有其他想法吗
提前感谢

以下设置对我有效:

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

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

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

为什么不在同一解决方案中的单独库项目中实现WCF服务,并简单地从web应用程序中引用该项目?这样,它们将不在预编译过程中,并且您可以在*.svc文件中使用可预测的类型名。此外,这可能也会给你一个更清洁的解决方案结构。

相关内容

  • 没有找到相关文章

最新更新