假设供应商提供了两个独立的Web服务,它们共享相同的数据类型和相同的命名空间。
e.g。 以下Web服务都包含类似的对象,例如TestCredentials对象:
使用Web引用将这些包含到Visual Studio中我最终得到:
当我真正想要的是:
在处理Web引用时,Visual Studio中是否有任何方法将这两个Web服务链接在一起,以便生成的代理类相同(并且在同一名称空间中)?
答案 0 :(得分:2)
另一个可能的选项(以及wsdl.exe / sharetypes)是使用Visual Studio 2008并使用“添加服务引用”。 “添加服务引用”对话框提供了重用类型的选项。
答案 1 :(得分:2)
您必须使用wsdl.exe program with the /sharetypes switch手动生成代理类。
答案 2 :(得分:1)
你应该做什么而不是在visual studio中添加web引用是使用wsdl.exe command line tool生成一个代理类,然后你可以编辑它来接受一个URL,而不是让两个硬编码的URL在不同的命名空间中。
答案 3 :(得分:0)
是的,你可以这样做。我们称之为数据编组,但在这个例子中我称之为合并者。
您会注意到WSDL生成的类是部分的,我们创建一个(Web引用名称).cs文件并具有类似的内容:
以下是您创建的文件,而不是WSDL生成的文件
public partial class WebReferenceName1 : System.Web.Services.Protocols.SoapHttpClientProtocol
{
// take the methodname and append Local to the end
public Consolidated.ReturnType MethodName1Local(params)
{
// redirect the return value of the call to the consolidation method and return the new value
return Consolidation.Convert(this.MethodName1(params);
}
}
然后是第二个Web服务
public partial class WebReferenceName2 : System.Web.Services.Protocols.SoapHttpClientProtocol
{
// take the methodname and append Local to the end
public Consolidated.ReturnType MethodName2Local(params)
{
// redirect the return value of the call to the consolidation method and return the new value
return Consolidation.Convert(this.MethodName2(params);
}
}
现在是从两种类型转换的类
public class Consolidation
{
// Input from Web Reference #1
public static Consolidated.ReturnType Convert(WebReferenceName1.ReturnType valuetoConvert)
{
// Convert from valuetoConvert to Consolidated.ReturnType
convertedValue = (conversion of valuetoConvert to Consolidated.ReturnType);
return convertedValue;
}
// Input from Web Reference #2
public static Consolidated.ReturnType Convert(WebReferenceName2.ReturnType valuetoConvert)
{
// Convert from valuetoConvert to Consolidated.ReturnType
convertedValue = (conversion of valuetoConvert to Consolidated.ReturnType);
return convertedValue;
}
}
基本上,您将方法添加到Web引用,调用{WebMethod} Local()方法,并通过Consolidator进行路由,并将简单的WSDL生成的类转换为您可以实际使用的类。
Consolidated.ReturnType是您在本地项目中定义的,它是WSDL在Web引用下生成的数据类型的本地版本。通常,“转换”只是属性从一种类型复制到另一种类型的克隆/属性。
答案 4 :(得分:0)
您可以创建一个引用所有Web服务的简单.disco文件。它只是每个Web服务的简单contractRef。
Visual Studio将共享类型,只要它们使用相同的xml命名空间。
答案 5 :(得分:-1)
我不相信,至少不是没有修改自动生成的reference.cs代码。
我想到的是一些解决方法: 1)创建一个基于反射的复制方法,该方法根据属性名称或复制值 2)如果您使用的是.NET 3.5,请编写一个扩展方法来复制这两种类型。