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.
Che cosa succede se si utilizza "Add Service Reference"? –
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