【问题标题】:How to add a web service reference in a DLL如何在 DLL 中添加 Web 服务引用
【发布时间】:2010-02-11 21:22:32
【问题描述】:

我正在创建一个引用 Web 服务的 DLL(我没有选择这样做),但我必须将 Web 服务引用添加到使用该 DLL 的项目才能工作。

例如,我有一个名为 API.DLL 的 DLL,它调用一个名为 WebService.svc 的 Web 服务,我想在名为 WinForm 的项目中使用该服务。首先,我必须在 API.DLL 中为 WebService.svc 添加一个“服务引用”。然后,我将引用 API.DLL 添加到 WinForm,但它不起作用,除非我还在 WinForm 中添加对 WebService.svc 的服务引用。

我可以做些什么来避免最后一步?

【问题讨论】:

  • 您不应该将服务引用添加到 WinForm...您看到的错误是什么?
  • System.InvalidOperationException 我的 .NET 是法语(...叹息...),但它说“找不到服务参考”。

标签: asp.net web-services dll


【解决方案1】:

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

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

我只是完成了这些步骤并列举了我的行动以产生您想要的结果。

创建一个名为“ReferencedWebService”的 Web 应用程序项目(因此是一个解决方案) 添加一个Web服务,只保留默认名称和实现 添加一个名为“ReferencedWebserviceAPI”的类库 添加服务参考 >高级 >添加 Web 参考>此解决方案中的 Web 服务 >网络服务1 >添加参考离开名称为'localhost' 添加一个名为“ReferencedWebserviceClient”的控制台应用程序项目 到 ReferencedWebserviceClient: 添加参考 >项目 >引用的WebserviceAPI 添加参考 >.Net >系统.Web.服务 在 Program.cs 中替换 Main: 静态无效主要(字符串 [] 参数) { var svc = new ReferencedWebserviceAPI.localhost.WebService1(); var 结果 = svc.HelloWorld(); Console.WriteLine(结果); Console.ReadLine(); } 将 ReferencedWebserviceClient 设置为启动项目并运行。 好的,这是最简单的场景。您必须处理的一个问题是默认服务 URL 是硬编码在 .dll 中的, 并将其设置为您的开发机器上的移植地址。 您将需要将配置参数添加到您的客户端项目。最简单和最便携的方法是使用 appSetting。 到 ReferencedWebserviceClient: 添加项目 >应用程序配置文件 用这个替换 App.Config 的内容,当然用你机器上的适当值替换值。 添加参考 >.Net >系统.配置 现在将 Main 替换为: 静态无效主要(字符串 [] 参数) { var svc = new ReferencedWebserviceAPI.localhost.WebService1 { Url = ConfigurationManager.AppSettings["serviceUrl"] }; var 结果 = svc.HelloWorld(); Console.WriteLine(结果); Console.ReadLine(); }

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

尝试将此模型应用于您当前的项目,看看它对您有何帮助。

如果你仍然有问题,你肯定有参考问题,应该从这个角度开始考虑。

希望对你有帮助

【讨论】:

    【解决方案2】:

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

    关于使用网络参考公开的类型,我不确定这是否是您遇到的问题。我在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
    }
    

    【讨论】:

    • 我认为问题确实是因为我必须在 WinForm 中引用 Web 服务,但我不想要这一步。我希望开发人员引用 .DLL 并自动引用 Web 服务。我该怎么做?
    • @dan WinForm 如何在不添加对 Web 服务的引用的情况下获取连接到 Web 服务的配置信息?查看添加 Web 引用时配置文件会发生什么情况。来自 DLL 的配置设置不会以任何方式影响 EXE。
    【解决方案3】:

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

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

    【讨论】:

    • 事实上,我的 API.dll 不会直接从 web 服务返回任何类型以避免该错误。这就像 DLL 使用来自宿主项目而不是来自自身的服务引用。
    • 好吧,那我就糊涂了!如果您创建一个新项目并引用您的 API.dll,会发生什么?你也遇到同样的错误吗?
    • 是的,如果我不添加对 Web 服务的引用,则会出现此错误。我认为这是因为所有自动生成的类都不遵循 DLL。
    • @dan,生成的类被编译到程序集中。请看我的回答。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      在您客户的项目中右键单击添加服务引用以添加方法和类

      然后要访问该服务,您可以在 dll 中执行类似的操作

      EndpointIdentity spn = EndpointIdentity.CreateSpnIdentity("host/mikev-ws");
      Uri uri = new Uri("http://example.com/test.asmx");
      var address = new EndpointAddress(uri, spn);
      BasicHttpBinding basic = new BasicHttpBinding();
      basic.Name = "bindingName";
      
      var client = new MyService.MyWebServiceSoapClient(basic, address);
      client.HelloWorld();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 2011-01-23
        • 2011-10-13
        • 1970-01-01
        • 2011-01-12
        • 2014-05-22
        • 1970-01-01
        相关资源
        最近更新 更多