【问题标题】:Web Service proxy class to implement interfaceWeb Service代理类实现接口
【发布时间】:2010-09-28 17:06:19
【问题描述】:

我正在寻找一种方法,让为 Web 引用(不是 WCF)生成的代理类实现一个通用接口,以便在 Web 服务访问和“直接”访问客户端应用程序中的业务层之间轻松切换,类似:

public IBusiness GetBusinessObject()
{
  if (_mode = "remote")
    return new BusinessWebService.Business(); // access through web service proxy class
  else
    return new Business(); // direct access
}

但是,自定义类型(例如下面示例中的 CustomSerializableType)不会在生成的代理类中引用。而是生成了新的相同类型,这使得代理类无法实现接口。

有什么方法可以让生成的代理类引用这些类型,还是我做错了?我是否应该考虑将 Web 服务转换为 WCF 服务?


详情

我们的解决方案由以下四个项目组成:

  • 业务库(包含业务逻辑,访问数据存储)
  • 通用库(包含通用功能,包括CustomSerializableType
  • Web 服务(充当远程客户端和业务层之间的代理)
  • Windows 应用程序

我们的客户希望 Windows 应用程序能够以两种不同的模式运行:

  • 本地模式,应用程序直接使用业务库来访问数据
  • 远程模式,应用程序与 Web 服务通信以访问数据

为了做到这一点,我们创建了一个接口,IBusiness,它位于公共库中,包含所有业务方法。

界面

public interface IBusiness
{
  CustomSerializableType DoSomeWork();
}

业务层

public class Business : IBusiness
{
  public CustomSerializableType DoSomeWork()
  {
    // access data store
  }
}

网络服务

public class WebServiceBusiness : IBusiness
{
  private Business _business = new Business();

  [WebMethod]
  public CustomSerializableType DoSomeWork()
  {
    return _business.DoSomeWork();
  }
}

生成的代理类(为了便于阅读,省略了大量代码)

public partial class Business
  : System.Web.Services.Protocols.SoapHttpClientProtocol
{

  public CustomSerializableType DoSomeWork()
  {
    // ...
  }

  public partial class CustomSerializableType {
    // PROBLEM: this new type is referenced, instead of the
    // type in the common library
  }
}

【问题讨论】:

  • 您是否使用 svcutil.exe 生成代理类?
  • 不,目前我只是在使用 Visual Studio 2010 内置工具。我试着用 wsdl.exe 弄乱了一点,但它并没有解决我的问题。 svcutil.exe 是更好的选择吗?那不需要我升级到 WCF 服务,而不是“旧版”Web 服务吗?

标签: c# web-services interface asmx proxy-classes


【解决方案1】:

假设您的客户端的默认命名空间为“Client”,并且您的 Web 引用名为“Proxy”,则执行以下操作;

  1. 在客户端项目的根目录中,创建一个名为“Proxy”的文件夹。
  2. 在该文件夹中,创建一个名为“Business”的类。
  3. 将该类公开和部分公开,并让它实现您的IBusiness 接口

这样,您无需修改​​ Reference.cs。您应该切勿修改 Reference.cs 或通过代码生成生成的任何其他文件。

请注意,这违反了 SOA 的原则,因为它将您的客户端紧密绑定到您的服务。至少,您应该在单独的项目中定义这些接口,以便您只在客户端和服务之间共享“接口”项目。

【讨论】:

  • 但是 Reference.cs 中包含的“克隆”类型(在某些情况下作为 Reference.map 下的 .datasource 文件存在)呢?这些类有效地改变了方法签名,使它们与接口中的那些不匹配,从而阻止我首先实现它。还是我在这里遗漏了什么?
  • 是的,你错过了一些东西!如果代理类型与接口不匹配,则它们无法实现接口。您必须创建自己的独立类型集,这些类型确实 实现了接口,然后调用 Web 服务来完成它们的工作。如果您想在使用数据库的实现和使用 XML 文件的实现之间切换,这正是您应该做的。
  • 所以为了调用web服务,我需要手动将接口引用的类型(例如Common.CustomSerializableType)转换为代理类使用的(克隆的)类型(例如Proxy.CustomSerializableType )?
  • 是的。这是使用 SOA 而不是将客户端与服务紧密绑定的一个非常好的理由。更好的是,使用 WCF,它可以解决这个问题。
  • 好的,谢谢。非常感谢您的帮助 :) 我在哪里可以了解 WCF 解决此问题的方法?
猜你喜欢
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2014-03-16
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
相关资源
最近更新 更多