如何在DLL中添加Web服务引用

问题描述 投票:6回答:5

我正在创建一个具有对Web服务的引用的DLL(我没有选择的余地,但是我必须向使用该DLL的项目中添加Web服务的引用。

[示例,我有一个名为API.DLL的DLL,该DLL调用了一个Web服务,即WebService.svc,我想在一个名为WinForm的项目中使用它。首先,我必须在API.DLL中向WebService.svc添加一个“服务引用”。然后,我向WinForm中添加了一个引用API.DLL,但是除非在WinForm中也添加了对WebService.svc的服务引用,否则它将无法工作。

如何避免最后一步?

asp.net web-services dll
5个回答
6
投票

您的第一步是向自己证明这是可能的,然后适应您的项目。

您可以下载可运行的解决方案here

我只是按照步骤进行操作,并列举了自己的行动以产生所需的结果。

创建一个名为“ ReferencedWebService”的Web应用程序项目(因此是一种解决方案)添加一个Web服务,只保留默认名称和实现添加一个名为“ ReferencedWebserviceAPI”的类库添加服务参考>高级>添加Web参考>此解决方案中的Web服务> WebService1>添加引用,将名称保留为“ localhost”添加一个名为“ ReferencedWebserviceClient”的控制台应用程序项目到ReferencedWebserviceClient:添加参考>项目>参考WebserviceAPI添加参考> .Net> System.Web.Services在Program.cs中,替换Main:静态void Main(string [] args){var svc = new ReferencedWebserviceAPI.localhost.WebService1();var result = svc.HelloWorld();Console.WriteLine(result);Console.ReadLine();}将ReferencedWebserviceClient设置为启动项目并运行。好的,这是最简单的情况。您将要处理的一个问题是,默认服务URL在.dll中进行了硬编码,并将其设置为开发计算机上的移植地址。您将需要向客户端项目中添加配置参数。最简单,最可移植的方法是使用appSetting。到ReferencedWebserviceClient:新增项目>应用程序配置文件以此替换App.Config的内容,当然用您的计算机上的适当值替换该值。添加参考> .Net>系统配置现在将Main替换为:静态void Main(string [] args){var svc = new ReferencedWebserviceAPI.localhost.WebService1{网址= ConfigurationManager.AppSettings [“ serviceUrl”]};var result = svc.HelloWorld();Console.WriteLine(result);Console.ReadLine();}

这是在可再发行的.dll中嵌入服务的基准。

尝试将此模型应用于您当前的项目,然后看它如何为您工作。

如果您仍然有问题,则肯定是参考问题,应该从这个角度着手研究。

希望这会有所帮助


5
投票

您可能正在使用Web服务公开的类型,或者可能是您必须添加Web引用,以便将适当的连接信息添加到配置文件中。 Winform应用程序不会以任何方式继承或使用DLL的配置文件,除非您为它准备了一些精美的加载机制。换句话说,在DLL中,当您添加Web引用时,它的配置文件会获取有关如何连接到Web服务的信息,但是当您在应用程序中使用DLL时,您的应用程序需要在其自己的配置文件中使用该信息,因此,您必须添加网络参考,以便生成信息。

关于使用Web参考公开的类型,我不确定这是否可能是您遇到的问题。我在DLL中遇到了这种情况。例如,SharpMap.dll声明一个SharpMapData类,而WrapperOfSharpMap.dll具有一个名为ProcessData(SharpMapData blah)

的方法。

如果编写WinForm应用程序并添加对WrapperOfSharpMap.dll的引用,我还必须添加对SharpMap.dll的引用,因为要调用ProcessData,我必须创建一个SharpMapData实例以传递给该函数。换句话说,我使用在SharpMap.dll中声明的类型,因此需要对其进行引用。

要解决此问题,WrapperOfSharpMap.dll的创建者必须像下面这样创建一个WrapperSharpMapData类:

class WrapperSharpMapData
{
  private SharpMapData hiddenSharpMapData;

  //create proprerties to access data elements using standard CLR types or other wrapper types
}

1
投票

是因为您需要服务引用,以便WinForm应用程序可以引用服务返回的类型?

如果是这种情况,您可以将您的API dll转换为服务的包装器,然后将服务中所有可用的方法包装在API中,并对对象进行相同的处理(假设它们是您创建的类) 。显然,您必须将服务返回的所有对象转换为API中的对象。但是一旦完成,就不需要在WinForm中引用该服务。 (很有趣,我正在自己做类似的事情!)。>


1
投票

您可以尝试查看svcutil.exe,它使您可以通过命令行为服务生成客户端代理代码。您应该能够获取它生成的代码文件,并将其简单地添加到DLL项目中。这使您可以完全绕过Visual Studio。


0
投票

右键单击客户项目中的添加服务参考

© www.soinside.com 2019 - 2024. All rights reserved.