gpt4 book ai didi

c# - 为什么 WCF 使用具有不同签名的新方法生成代理包装契约接口(interface)方法?

转载 作者:太空狗 更新时间:2023-10-29 21:30:03 24 4
gpt4 key购买 nike

我正在使用 WCF 订阅 SQL Server 2008 SSRS Web 服务(.../reportserver/ReportService2005.asmx?wsdl),据我所知,默认的 WCF 配置选项。

虽然它在生成本地代理类时做了一些奇怪的事情。

我将使用 ListChildren 方法作为示例:

在客户端,WCF 生成如下所示的接口(interface),正如您所期望的那样:

public interface ReportingService2005Soap {

ListChildrenResponse ListChildren(ListChildrenRequest request);

}

它还会生成一个实现该接口(interface)的“客户端”代理:

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;
}

}

如您所见,客户端代理实现了该接口(interface),然后通过显式实现该接口(interface)(因此您必须强制转换以获取该接口(interface)方法)和另外一个 EditorBrowsableState.Advanced 属性来“隐藏”它不被使用。

然后它添加了一个使用“out”参数的额外包装器方法。

如果不这样做,是否有办法停止,直接让它实现接口(interface)?

它在这里的作用是引导您使用带有“out”参数的包装方法,然后您发现您不能很容易地模拟该服务,因为包装方法不是虚拟的,也没有定义在任何界面中。

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

最佳答案

如果您的服务正在使用 MessageContract,则可能会发生这种情况。默认情况下,代理创建会尝试解包这些消息契约,以便暴露的操作直接接受它们的内容。如果您还想在客户端上使用消息契约,则需要通过选中始终生成消息契约,在添加服务引用 的高级设置中对其进行配置。

关于c# - 为什么 WCF 使用具有不同签名的新方法生成代理包装契约接口(interface)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7203789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com