在没有XSD的情况下共享WSDL类型

时间:2013-04-23 09:08:40

标签: c# wcf web-services xsd wsdl

我似乎无法找到从具有共享类型的WSDL生成代理但没有任何XSD与它们一起生成代理的示例。任何人都可以将此标记为重复,请指出一个例子吗?

以下是2个服务,每个服务都有自己的命名空间和通用类型。唯一可公开访问的是他们的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; }
}

3 个答案:

答案 0 :(得分:1)

有一种方法可以做到这一点,概述为here

在您的情况下,您可以跳过第一步,从服务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

答案 1 :(得分:1)

首先,你需要为所有常见的服务数据类型设置[DataContract(Namespace =“some namespace”)],否则当生成WSDL和XSD时,你将拥有来自两个不同命名空间的对象---这绝对是必要的。命名空间值仅适用于XSD中定义的类型,而不适用于WSDL中。 XSD =数据,WSDL =服务。

XSD和WSDL,只有当您拥有META服务行为集时才会生成 - 添加此行为,然后您可以导航到该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;
    }
}

答案 2 :(得分:1)

添加两个网络引用后:

  1. 双击第二个Web服务引用
  2. 对象浏览器中的
  3. 导航到Foo的定义
  4. 右键单击Foo并选择转到定义
  5. 删除Foo类的定义
  6. 为webservice one
  7. 添加一个using语句
  8. 仅使用<namespace-of-service-reference-2>.Foo
  9. 查找并替换Foo的所有实例

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