2009-07-09 23 views
12

Desidero utilizzare svcutil per mappare più spazio dei nomi wsdl in spazio dei nomi clr durante la generazione dei proxy di servizio. Uso il robusto controllo delle versioni dei namespace e quindi gli spazi dei nomi clr generati sono scomodi e possono significare molte modifiche al codice lato client se la versione dello spazio dei nomi wsdl/xsd cambia. Un esempio di codice sarebbe meglio mostrare ciò che voglio.utilizzare svcutil per mappare più spazi dei nomi per la generazione dei proxy dei servizi wcf

// 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 - senza mapping namespace

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 

Il proxy generato assomiglia

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{} 
} 

Le classi client sono fuori da ogni namespace. Qualsiasi modifica allo spazio dei nomi xsd implicherebbe la modifica di tutte le istruzioni using nel mio codice cliente, tutto il build si interromperà.

2. svcutil - con la mappatura dello spazio dei nomi jolly

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 

Il proxy generato assomiglia

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

noti che svcutil è cambiato automaticamente uno della classe Indirizzo a Indirizzo1. Non mi piace. Tutte le classi client si trovano anche nello stesso spazio dei nomi.

Quello che voglio

Qualcosa di simile a questo:

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 

In questo modo posso logicamente gruppo lo spazio dei nomi CLR e qualsiasi modifica WSDL/XSD namespace viene gestito nella generazione di proxy unica senza influenzare il resto del codice lato client.

Ora questo non è possibile. Lo svcutil permette di mappare solo uno o tutti gli spazi dei nomi, non una lista di mappature.

posso fare una mappatura come illustrato di seguito, ma non più

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

Ma c'è qualche soluzione. Svcutil non è magico, è scritto in. Net e genera programmaticamente i proxy. Qualcuno ha scritto un supplente a svcutil o mi indica le direzioni in modo che io possa scriverne uno.

+0

Che cosa succede se si utilizza "Add Service Reference"? –

+0

Non ho provato dal momento che ho bisogno di usare il svcutil per generare proxy da dll. Ma suppongo che dato che "aggiungere riferimento al servizio" abbia l'opzione di inserire solo uno spazio dei nomi, sarebbe uguale al mapping dei namespace con caratteri jolly. – softveda

risposta

20

È possibile eseguire più mapping dello spazio dei nomi fornendo ulteriori parametri dello spazio dei nomi, non in base al punto e virgola che li separa. Così il vostro esempio dovrebbe essere invece

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 

Anche se, attualmente sto avendo difficoltà in cui i tipi generati da file .xsd non sono interessati da questi spazi dei nomi. Sono solo i tipi generati dai file .wsdl. La documentazione implica che entrambi dovrebbero essere.

+2

Hai la fortuna di ottenere la mappatura dello spazio dei nomi per influenzare anche i tipi xsd? –

+0

@Lester: non l'ho approfondito ulteriormente al momento. Abbiamo finito per evitare la necessità di xsds incorporando quei tipi nelle wsdls che penso. (Sono passati 3 anni, attenzione.) Forse VS2010 è migliorato in questa situazione? Quanto sopra è stato fatto con VS2008. –

+1

@DaveCameron Passano altri due anni e sto ancora riscontrando lo stesso problema in VS2013 :-( –

0

Solo nel caso in cui si desidera mappare tutti gli spazi dei nomi di schema per uno spazio dei nomi CLR poi:

SvcUtil "your wsdl file.xml" /n:*,RequiredClrNamespace 
Problemi correlati