如何将服务引用移动到自己的程序集?

时间:2009-01-22 15:00:51

标签: c# .net asp.net vb.net web-services

一点背景:

我正在创建一组适配器,以允许通过不同的蜂窝网络与移动设备进行通信。这将使用类工厂模式实现。至少有一个网络需要服务引用来通过Web服务与其设备进行通信。

到目前为止,到目前为止我已经有3个程序集代表:

  • 包含主适配器库的程序集:包含
    • 每个适配器的接口定义
    • 基类
    • 在运行时实例化指定适配器的类工厂。
  • 每个网络适配器实现的程序集。
  • 包含我的主要应用程序的程序集。

鉴于我不想将服务引用及其配置添加到主应用程序集[因为它与主应用程序无关],如何强制每个程序集的服务引用从其自己的应用程序获取其配置的.config?

如果我在主app.config中有服务引用配置,一切正常,但如果我将配置移动到适配器的app.config,一切都停止工作,在我新建Soap1Client时抛出以下异常

  

“无法在ServiceModel客户端配置部分找到引用合同'MobileService.Service1Soap'的默认端点元素。这可能是因为找不到您的应用程序的配置文件,或者因为找不到与此合同匹配的端点元素客户元素。“

4 个答案:

答案 0 :(得分:2)

最后,我刚刚删除了服务引用并添加了一个Web引用[即做到2.0的方式]。由于某种原因,Web引用将访问其自己的app.config而不是主应用程序的app.config。

比替代方案容易得多......

答案 1 :(得分:1)

您可以以编程方式设置所有选项。

答案 2 :(得分:0)

我不相信有一种内置的.NET方法来实现这一目标。但是,您应该能够通过编写一些代码来解析每个引用的程序集的.config文件来完成它。

以下是使用特定于程序集的配置文件的示例,该文件应指向正确的方向:http://www.bearcanyon.com/dotnet/#AssemblySettings

我在.NET Winforms应用程序中做了类似的事情并且运行良好。

答案 3 :(得分:0)

如果您必须让磁带库从配置文件中读取服务的配置,那么您可能会运气不好。该库成为该过程的一部分,该过程使用启动该过程的应用程序的配置。

但是,在库中,您可以使用服务引用代理类构造函数重载之一在实例化服务引用时动态设置配置。然后,您不必在任何配置文件中具有服务引用绑定配置。我使用的重载有两个参数:System.ServiceModel.Channels.Binding binding& System.ServiceModel.EndpointAddress remoteAddress。请注意,Binding类是一个抽象类,您必须使用其中一个继承的类 - 您可以在此处找到它们的列表:https://msdn.microsoft.com/en-us/library/system.servicemodel.channels.binding(v=vs.110).aspx

对于简单的http服务引用,我使用BasicHttpBinding类的默认实例,并使用我引用的服务的URL创建EndpointAddress类的实例。显然你必须修改它以使用https或安全服务等。

当然,如果您不想在图书馆中对其进行硬编码,这仍然会引发图书馆如何获得正确的服务网址的问题?有两种方法可以从数据库或已知的文件位置读取它。