为什么WCF生成的代理用不同签名的新方法包装契约接口方法?

本文关键字:包装 新方法 契约 方法 接口 WCF 代理 为什么 | 更新日期: 2023-09-27 18:06:39

我正在使用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。高级属性。

然后添加一个额外的包装器方法,使用'out'参数。

是否有一种方法可以阻止它这样做,只是让它直接实现接口?

它在这里所做的使您沿着使用带有'out'参数的包装器方法的路径,然后您发现您不能很容易地模拟服务,因为包装器方法不是虚拟的,并且没有在任何接口中定义。

注意:我在这里使用SSRS web服务作为示例,但我也看到WCF在其他服务上也这样做。

为什么WCF生成的代理用不同签名的新方法包装契约接口方法?

如果您的服务使用MessageContract s,则可能发生这种情况。默认情况下,代理创建尝试打开这些消息契约,以便公开的操作直接接受它们的内容。如果你也想在客户端使用消息契约,你需要在的高级设置中配置它,通过检查添加服务引用始终生成消息契约