我正在使用 WCF 订阅 SQL Server 2008 SSRS Web 服务(.../reportserver/ReportService2005.asmx?wsdl),据我所知,默认的 WCF 配置选项。
但是,它在生成本地代理类时会做一些奇怪的事情。
我将使用 ListChildren 方法作为示例:
在客户端,WCF 会生成这样的接口,正如您所期望的:
public interface ReportingService2005Soap {
ListChildrenResponse ListChildren(ListChildrenRequest request);
}
它还生成一个实现该接口的“客户端”代理:
public partial class ReportingService2005SoapClient :
System.ServiceModel.ClientBase<ReportingService2005Soap>, ReportingService2005Soap
{
[EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
ListChildrenResponse ReportingService2005Soap.ListChildren(ListChildrenRequest request)
{
return base.Channel.ListChildren(request);
}
public ServerInfoHeader ListChildren(string Item, bool Recursive, out CatalogItem[] CatalogItems) {
ListChildrenRequest inValue = new ListChildrenRequest();
inValue.Item = Item;
inValue.Recursive = Recursive;
ListChildrenResponse retVal = ((ReportingService2005Soap)(this)).ListChildren(inValue);
CatalogItems = retVal.CatalogItems;
return retVal.ServerInfoHeader;
}
}
如您所见,客户端代理实现了接口,然后通过显式实现接口(因此您必须强制转换以获取接口方法)并另外使用 EditorBrowsableState.Advanced 属性来“隐藏”它以使其不被使用。
然后,它添加了一个使用“out”参数的额外包装方法。
如果不这样做,有没有办法停止,直接实现接口?
它在这里所做的事情会引导您使用带有“out”参数的包装器方法,然后您会发现您不能很容易地模拟服务,因为包装器方法不是虚拟的,也没有在任何接口中定义.
注意:我在这里使用 SSRS Web 服务作为示例,但我已经看到 WCF 在其他服务上也这样做了。