9

我似乎找不到从具有共享类型的 WSDL 生成代理但没有任何 XSD 的示例。任何人都可以将其标记为重复并指出一个例子吗?

这里有 2 个服务,每个都有自己的命名空间和通用类型。唯一可以公开访问的是它们的 WSDL,没有类型的 XSD 或其 .dll 可以传递给wsdl.exe /sharedtypessvcutils没有它,我最终得到相同class Foo的,我无法传递给SetFooand 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; }
}
4

3 回答 3

1

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

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

于 2013-04-24T14:41:05.500 回答
1

添加您的两个网络参考后:

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

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

于 2013-05-06T21:13:56.673 回答
1

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

当且仅当您设置了 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;
    }
}
于 2013-05-01T09:18:59.107 回答