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

3
我有一个WCF服务,托管在IIS中,是使用Visual Studio构建的。该WCF服务库引用了一些其他程序集,这些程序集是同一Visual Studio解决方案的一部分。
我将所有程序集部署到GAC中,然后启动服务客户端,看到它无法解析其中一个已引用的客户端程序集而失败。我在WCF服务构造函数中添加了一个断点,发现它似乎不使用限定名称(因此找不到它们在GAC中)。如果我在IIS中的WCF构造函数中断点时在立即窗口中运行Assembly.Load,我可以使用限定名称(publickeytoken等)加载每个缺失的dll。
为什么CLR或我的服务库尝试仅使用名称加载库?
4个回答

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管理器来重新加载你的应用程序域。


今天我遇到了类似的问题,为了以后的人指出一些东西,在@Ryu的答案之外,确保您不要自我关闭<compilation>标签。即<compilation></compilation>而不是<compilation .. />。这很愚蠢但很容易错过...请参见此链接:http://stackoverflow.com/questions/7697741/the-configuration-section-assemblies-cannot-be-read-because-it-is-missing-a-se - KDT

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>

不,这是同一个版本。在构建解决方案之前,gac 已经完全清除(以避免任何混淆)。此外,库的唯一版本是 1.0.0.0。 - Benson

0

我们有时会遇到缓存问题。系统之前尝试从GAC访问某些内容,但没有找到,它记住了这一点,下次就不再检查。

在将程序集添加到GAC后,请尝试进行IIS重置。

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


0

你可以尝试使用服务的完全限定程序集名称。据我了解,当涉及到GAC时,这是唯一可行的方法。

除此之外,你可以启用Fusion日志,查看应用程序尝试从哪里加载程序集以及为什么失败。Scott Hanselman有一个非常好的教程如何使用它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接