将网络引用添加到GACed的DLL

时间:2020-03-06 14:38:31  来源:igfitidea点击:

我在SharePoint中编写事件处理程序时遇到了此问题。我的事件处理程序有一个Web参考。当我创建此Web参考时,Web服务的URL将添加到程序集的.config文件中。如果我必须更改Web参考URL,则只需更改配置文件中的链接。

当我尝试GAC dll时出现问题。当我GAC DLL时,配置文件无法与DLL一起GACed,因此,没有办法让我更新Web参考。

我发现的一种解决方法是修改构造函数方法Reference.cs类,该类在添加引用时由Visual Studio自动生成,以便构造函数从其他位置读取Web服务url,例如在某些位置中表示注册表或者XML文件预定位置。但这有时会带来问题,因为当我使用Visual Studio更新Web参考时,此Reference.cs文件将重新生成,并且所有修改都将丢失。

有没有更好的方法来解决此问题?

解决方案

如果我们具有Visual Studio 2008,请使用服务引用而不是Web引用,这将生成部分类,我们可以使用这些类来覆盖功能,而不会被生成器覆盖代码。

对于Visual Studio 2005,我们可以仅将partial关键字添加到Reference.cs中的类,并使用自己的部分类保留一个单独的文件:

public partial class WebServiceReference
 { public WebServiceReference(ExampleConfigurationClass config) 
    { /* ... */
    }
 }

WebServiceReference svc = new WebServiceReference(myConfig);

SharePoint托管的任何应用程序都使用位于IIS中SharePoint网站根目录的web.config。我们需要做的是将" Web /服务参考"向导生成的配置添加到web.config中。

大致是这样的:

  • SharePoint应用程序池加载DLL
  • DLL在当前应用程序配置文件中查找服务信息
  • DLL找到web.config并在其中查找配置信息

基本上,不会使用在DLL中生成的app.config。在这种情况下,由于应用程序是承载SharePoint应用程序的应用程序池(w3wp.exe)。对于SharePoint,app.config实际上名为web.config,位于SharePoint网站的根目录。

我们可以尝试这样做:与其使用动态Web引用,还不如将其设为静态引用,这样,Reference.cs中的代码就不会在.config文件中查找该URL的值。然后,对生成的Web服务客户端代码进行子类化,并在该派生类中添加我们自己的逻辑来设置.Url属性。然后,VS.NET可以重新生成它所喜欢的Reference.cs,并且url设置代码将保留。当然,我们必须更新任何下游代码以使用派生类,但这应该是一个简单的全局替换。

我通过使类库的Web参考动态化,然后将包含Web参考的applicationSettings config部分从app.config文件复制到我的Sharepoint网站web.config中来解决了这一问题。

请注意,我们还需要将applicationSettings的条目复制到web.config中,因为该位置通常不存在。