共享没有XSD的WSDL类型
本文关键字:WSDL 类型 XSD 共享 | 更新日期: 2023-09-27 18:10:32
我似乎找不到一个从具有共享类型的wsdl生成代理但没有任何xsd的例子。谁能把这个标记为副本并指出一个例子吗?
这里有两个服务,每个都有自己的命名空间和公共类型。唯一可以公开访问的是他们的wsdl,没有类型的XSD或它的.dll传递给wsdl.exe /sharedtypes
或svcutils
,没有它,我最终得到了相同的class Foo
,我不能传递给SetFoo
和class Foo1
。
我能想到的最好的是通过编程生成代理并通过CodeDOM检测重复,忽略DataContract
/WebServiceBinding
命名空间,但这是一个巨大的混乱…
[WebService(Namespace = "http://tempuri.org/FOO1")]
public class Service1 : WebService
{
[WebMethod]
public Foo GetFoo()
{
return new Foo();
}
}
[WebService(Namespace = "http://tempuri.org/FOO2")]
public class Service2 : WebService
{
[WebMethod]
public void SetFoo(Foo foo)
{
}
}
public class Foo
{
public int Bar { get; set; }
}
有一种方法可以做到这一点,这里概述一下。
在您的情况下,您可以跳过第一步,从服务1生成代理,然后在生成服务2代理时使用svcutil上的/r标志来引用服务1代理程序集。
这将确保您的服务2代理将使用与服务1代理相同的Foo实例。
但是,您是否考虑过仅托管具有两个操作的单个服务?这会节省你很多工作。
编辑:也看看这篇文章:http://blogs.msdn.com/b/youssefm/archive/2009/10/09/reusing-types-in-referenced-assemblies-with-svcutil-s-r-switch.aspx
首先,您需要为所有常见的服务数据类型设置[DataContract(Namespace="这里的某个名称空间")],否则,当生成WSDL和xsd时,您将拥有来自两个不同名称空间的对象——这绝对是必要的。名称空间值只适用于XSD中定义的类型,而不适用于WSDL。XSD = data, WSDL = service.
当且仅当您拥有META服务行为集时,生成xsd和WSDL—添加此行为,然后您就可以导航到URL。然后,META服务行为的URL将有一个指向wsdl和xsd的链接。
我使用下面的一段代码在windows服务中自托管服务,而不是通过IIS,但是同样的原则适用....
/// <summary>
/// Enables meta data output for a service host.
/// </summary>
/// <param name="host">The service host.</param>
/// <remarks>Must be invoked prior to starting the service host.</remarks>
public static void SetupMetaDataBehaviour(ServiceHost host)
{
ServiceMetadataBehavior metaDataBehaviour = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (metaDataBehaviour == null)
{
metaDataBehaviour = new ServiceMetadataBehavior();
metaDataBehaviour.HttpGetEnabled = true;
host.Description.Behaviors.Add(metaDataBehaviour);
}
else
{
metaDataBehaviour.HttpGetEnabled = true;
}
}
添加两个web引用后:
- 双击第二个web服务参考对象浏览器中的
- 导航到Foo 的定义
- 右键单击Foo,选择转到定义
- 删除Foo类定义
- 为webservice one 的命名空间添加using语句
- 查找
<namespace-of-service-reference-2>.Foo
的所有实例并替换为Foo
这将解决您的问题,因为它强制两个服务引用的自动生成代码使用相同的类声明。