2009-07-09 15 views
12

मैं सर्विस प्रॉक्सी उत्पन्न करते समय नामस्थान स्थान पर एकाधिक wsdl नेमस्पेस को मैप करने के लिए svcutil का उपयोग करना चाहता हूं। मैं नामस्थानों के मजबूत संस्करण का उपयोग करता हूं और इसलिए जेनरेट क्लियर नेमस्पेस अजीब हैं और इसका मतलब हो सकता है कि wsdl/xsd नेमस्पेस संस्करण में परिवर्तन होने पर कई क्लाइंट साइड कोड में परिवर्तन हो सकते हैं। एक कोड उदाहरण जो मैं चाहता हूं उसे दिखाने के लिए बेहतर होगा।wcf सेवा प्रॉक्सी उत्पन्न करने के लिए एकाधिक नामस्थानों को मानचित्रित करने के लिए svcutil का उपयोग करें

// Service code 
namespace TestService.StoreService 
{ 
    [DataContract(Namespace = "http://mydomain.com/xsd/Model/Store/2009/07/01")] 
    public class Address 
    { 
     [DataMember(IsRequired = true, Order = 0)] 
     public string street { get; set; } 
    } 

    [ServiceContract(Namespace = "http://mydomain.com/wsdl/StoreService-v1.0")] 
    public interface IStoreService 
    { 
     [OperationContract] 
     List<Customer> GetAllCustomersForStore(int storeId); 

     [OperationContract] 
     Address GetStoreAddress(int storeId); 
    } 

    public class StoreService : IStoreService 
    { 
     public List<Customer> GetAllCustomersForStore(int storeId) 
     { 
      throw new NotImplementedException(); 
     } 

     public Address GetStoreAddress(int storeId) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

namespace TestService.CustomerService 
{ 
    [DataContract(Namespace = "http://mydomain.com/xsd/Model/Customer/2009/07/01")] 
    public class Address 
    { 
     [DataMember(IsRequired = true, Order = 0)] 
     public string city { get; set; } 
    } 

    [ServiceContract(Namespace = "http://mydomain.com/wsdl/CustomerService-v1.0")] 
    public interface ICustomerService 
    { 
     [OperationContract] 
     Customer GetCustomer(int customerId); 

     [OperationContract] 
     Address GetStoreAddress(int customerId); 
    } 

    public class CustomerService : ICustomerService 
    { 
     public Customer GetCustomer(int customerId) 
     { 
      throw new NotImplementedException(); 
     } 

     public Address GetStoreAddress(int customerId) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

namespace TestService.Shared 
{ 
    [DataContract(Namespace = "http://mydomain.com/xsd/Model/Shared/2009/07/01")] 
    public class Customer 
    { 
     [DataMember(IsRequired = true, Order = 0)] 
     public int CustomerId { get; set; } 
     [DataMember(IsRequired = true, Order = 1)] 
     public string FirstName { get; set; } 
    } 
} 

1. svcutil - नाम स्थान मानचित्रण के बिना

svcutil.exe /t:metadata 
    TestSvcUtil\bin\debug\TestService.CustomerService.dll  
    TestSvcUtil\bin\debug\TestService.StoreService.dll 

svcutil.exe /t:code *.wsdl *.xsd /o:TestClient\WebServiceProxy.cs 

उत्पन्न प्रॉक्सी लग रहा है ग्राहक वर्गों

तरह
namespace mydomain.com.xsd.Model.Shared._2009._07._011 
{ 
    public partial class Customer{} 
} 
namespace mydomain.com.xsd.Model.Customer._2009._07._011 
{ 
    public partial class Address{} 
} 
namespace mydomain.com.xsd.Model.Store._2009._07._011 
{ 
    public partial class Address{} 
} 

किसी भी नामस्थान से बाहर हैं। एक्सएसडी नेमस्पेस में कोई भी बदलाव मेरे क्लाइंट कोड में सभी बयानों का उपयोग करके सभी बदलावों को बदल देगा।

2. svcutil - वाइल्डकार्ड नाम स्थान मानचित्रण के साथ

svcutil.exe /t:metadata 
    TestSvcUtil\bin\debug\TestService.CustomerService.dll 
    TestSvcUtil\bin\debug\TestService.StoreService.dll 

svcutil.exe /t:code *.wsdl *.xsd /n:*,MyDomain.ServiceProxy 
    /o:TestClient\WebServicesProxy2.cs 

उत्पन्न प्रॉक्सी की तरह

namespace MyDomain.ServiceProxy 
{ 
    public partial class Customer{} 
    public partial class Address{} 
    public partial class Address1{} 
    public partial class CustomerServiceClient{} 
    public partial class StoreServiceClient{} 
} 

सूचना लग रहा है कि svcutil स्वचालित रूप से पता 1 को पता वर्ग में से एक बदल गया है। मुझे यह पसंद नहीं है। सभी ग्राहक वर्ग एक ही नामस्थान के अंदर भी हैं।

मैं क्या चाहता हूँ

कुछ इस तरह:

svcutil.exe 
    /t:code *.wsdl *.xsd 
    /n:"http://mydomain.com/xsd/Model/Shared/2009/07/01, MyDomain.Model.Shared;http://mydomain.com/xsd/Model/Customer/2009/07/01, MyDomain.Model.Customer;http://mydomain.com/wsdl/CustomerService-v1.0, MyDomain.CustomerServiceProxy;http://mydomain.com/xsd/Model/Store/2009/07/01, MyDomain.Model.Store;http://mydomain.com/wsdl/StoreService-v1.0, MyDomain.StoreServiceProxy" 
    /o:TestClient\WebServiceProxy3.cs 

इस तरह से मैं तार्किक समूह clr नाम स्थान और wsdl/XSD नाम स्थान में कोई परिवर्तन केवल प्रभावित किए बिना प्रॉक्सी पीढ़ी में नियंत्रित किया जाता है कर सकते हैं शेष ग्राहक पक्ष कोड।

अब यह संभव नहीं है। Svcutil मैपिंग की सूची नहीं, केवल एक या सभी नामस्थान मैप करने की अनुमति देता है।

मैं नीचे के रूप में लेकिन कई नहीं दिखाया

svcutil.exe 
    /t:code *.wsdl *.xsd 
    /n:"http://mydomain.com/xsd/Model/Store/2009/07/01, MyDomain.Model.Address" 
    /o:TestClient\WebServiceProxy4.cs 

लेकिन वहाँ किसी भी समाधान है एक मानचित्रण कर सकते हैं। Svcutil जादू नहीं है, यह नेट में लिखा है और प्रोग्रामिक रूप से प्रॉक्सी उत्पन्न। क्या किसी ने svcutil के लिए एक वैकल्पिक लिखा है या मुझे निर्देशों के लिए इंगित किया है ताकि मैं एक लिख सकूं।

+0

अगर आप सिर्फ "सेवा संदर्भ जोड़ें" का उपयोग क्या होता है? –

+0

मैंने कोशिश नहीं की है क्योंकि मुझे डीएलएल से प्रॉक्सी उत्पन्न करने के लिए svcutil का उपयोग करने की आवश्यकता है। लेकिन मुझे लगता है कि "सेवा संदर्भ जोड़ें" में केवल एक नामस्थान इनपुट करने का विकल्प है, यह वाइल्डकार्ड नेमस्पेस मैपिंग जैसा ही होगा। – softveda

उत्तर

20

आप अतिरिक्त नेमस्पेस पैरामीटर प्रदान करके एकाधिक नामस्थान मैपिंग कर सकते हैं - अर्द्ध-कोलन से अलग नहीं। तो अपने उदाहरण के बजाय

svcutil.exe /t:code *.wsdl *.xsd 
/n:http://mydomain.com/xsd/Model/Shared/2009/07/01,MyDomain.Model.Shared 
/n:http://mydomain.com/xsd/Model/Customer/2009/07/01,MyDomain.Model.Customer 
/n:http://mydomain.com/wsdl/CustomerService-v1.0,MyDomain.CustomerServiceProxy 
/n:http://mydomain.com/xsd/Model/Store/2009/07/01,MyDomain.Model.Store 
/n:http://mydomain.com/wsdl/StoreService-v1.0,MyDomain.StoreServiceProxy 
/o:TestClient\WebServiceProxy3.cs 

हालांकि, मैं वर्तमान मुसीबत जहां .xsd फ़ाइलों से उत्पन्न प्रकार इन नामस्थान से प्रभावित नहीं हैं हो रहा है होना चाहिए। केवल .wsdl फ़ाइलों से उत्पन्न प्रकार हैं। दस्तावेज़ीकरण का तात्पर्य है कि दोनों होना चाहिए।

+2

किसी भी भाग्य को xsd प्रकारों को प्रभावित करने के लिए नामस्थान मैपिंग भी मिल रही है? –

+0

@ लेस्टर: उस समय मैंने इसे आगे नहीं बढ़ाया। हमने उन प्रकारों को एम्बेड करके xsds की आवश्यकता से बचने के लिए समाप्त किया जो मुझे लगता है wsdls। (यह 3 साल हो गया है, आपको दिमाग है।) शायद इस स्थिति पर वीएस -2010 में सुधार हुआ? उपर्युक्त वीएस -2008 के साथ किया गया था। –

+1

@ डेव कैमरून कुछ और साल बीत चुके हैं, और मैं अभी भी वीएस2013 में इस मुद्दे को मार रहा हूं :-( –

0

बस मामले में आप एक CLR नाम स्थान तो करने के लिए सभी स्कीमा नामस्थान मैप करना चाहते हैं:

SvcUtil "your wsdl file.xml" /n:*,RequiredClrNamespace 
संबंधित मुद्दे

 संबंधित मुद्दे