共享没有XSD的WSDL类型

本文关键字:WSDL 类型 XSD 共享 | 更新日期: 2023-09-27 18:10:32

我似乎找不到一个从具有共享类型的wsdl生成代理但没有任何xsd的例子。谁能把这个标记为副本并指出一个例子吗?

这里有两个服务,每个都有自己的命名空间和公共类型。唯一可以公开访问的是他们的wsdl,没有类型的XSD或它的.dll传递给wsdl.exe /sharedtypessvcutils,没有它,我最终得到了相同的class Foo,我不能传递给SetFooclass 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; }
}

共享没有XSD的WSDL类型

有一种方法可以做到这一点,这里概述一下。

在您的情况下,您可以跳过第一步,从服务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服务参考对象浏览器中的
  1. 导航到Foo
  2. 的定义
  3. 右键单击Foo,选择转到定义
  4. 删除Foo类定义
  5. 为webservice one
  6. 的命名空间添加using语句
  7. 查找<namespace-of-service-reference-2>.Foo的所有实例并替换为Foo

这将解决您的问题,因为它强制两个服务引用的自动生成代码使用相同的类声明。