WCF服务无法从GAC加载引用的程序集

时间:2009-09-28 14:03:12

标签: c# .net visual-studio wcf iis

我有一个在IIS中托管的WCF服务,它是在Visual Studio中构建的。 WCF服务库引用了一些其他程序集,这些程序集是同一Visual Studio解决方案的一部分。

我将所有程序集部署到GAC,然后启动服务客户端,并看到它尝试解析其中一个引用的客户端程序集失败。我在WCF服务构造函数中添加了一个断点,它似乎没有尝试使用限定名称加载其引用的程序集(因此在GAC中找不到它们)。如果我在即时窗口中运行Assembly.Load,一旦进入WCF构造函数,在IIS中,我就可以使用限定的(publickeytoken等名称)加载每个缺少的dll。

为什么CLR或我的服务库尝试仅使用名称加载库?

4 个答案:

答案 0 :(得分:3)

尝试使用以下

更新IIS Web应用程序web.config
<compilation debug="true">
      <assemblies>
        <add assembly="MyWcfAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=AAAAAAAAAA"/>

根据我的经验,当dll未在本地复制并且需要从GAC读取时,有时需要这样做。

您还需要为网页重新加载应用领域,以使用安装在GAC中的最新程序集。您可以通过执行iisreset重新加载您的应用程序域,触摸web.config或iis管理器。

答案 1 :(得分:0)

GAC中的版本是否与您构建的版本不同?如果是这样,那么您可以强制您的应用程序使用特定版本的程序集。在web.config中,添加以下内容:

<configuration>
   .......
   <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     <dependentAssembly>
       <assemblyIdentity name="SomeLibrary" publicKeyToken="31bfe996bd364e76"/>
       <bindingRedirect oldVersion="0.5" newVersion="1.0"/>
     </dependentAssembly>
    </assemblyBinding>
   </runtime>
   ........
</configuration>

答案 2 :(得分:0)

我们有时会遇到体验缓存问题。该系统以前曾尝试从GAC访问某些内容,它不在那里,它记得下次它没有费心去检查。

将组件添加到GAC后尝试执行IIS重置。

此外,版本匹配的公钥令牌也必须匹配。

答案 3 :(得分:0)

您可以尝试的一件事是使用服务的完全限定的程序集名称。我的理解是,在与GAC打交道时,这是唯一的出路。

除此之外,您还可以启用Fusion日志,以查看应用程序从哪里尝试加载程序集,以及为什么会出现故障。 Scott Hanselman在how to use them.

上有一个非常好的教程