簡體   English   中英

在沒有XSD的情況下共享WSDL類型

[英]Sharing WSDL types without XSD

我似乎無法找到從具有共享類型的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; }
}

有這樣做,這是概括的方式在這里

在您的情況下,您可以跳過第一步,從服務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

首先,你需要為所有常見的服務數據類型設置[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;
    }
}

添加兩個Web引用后:

  1. 雙擊第二個Web服務引用
  2. 在對象瀏覽器中導航到Foo的定義
  3. 右鍵單擊Foo並選擇轉到定義
  4. 刪除類Foo的定義
  5. 為webservice的名稱空間添加一個using語句
  6. 使用Foo查找並替換<namespace-of-service-reference-2>.Foo所有實例

這應該可以解決您的問題,因為它會強制兩個服務引用的自動生成的代碼使用相同的類聲明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM