[英]Sharing WSDL types without XSD
我似乎無法找到從具有共享類型的WSDL生成代理但沒有任何XSD與它們一起生成代理的示例。 任何人都可以將此標記為重復,請指出一個例子嗎?
這里有2個服務,每個服務都有自己的命名空間和通用類型。 唯一可公開訪問的是它們的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-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引用后:
Foo
查找並替換<namespace-of-service-reference-2>.Foo
所有實例 這應該可以解決您的問題,因為它會強制兩個服務引用的自動生成的代碼使用相同的類聲明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.