【发布时间】: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