uso svcutil para asignar múltiples espacios de nombres para la generación de servidores proxy de servicio wcf

Quiero usar svcutil para asignar varias wsdl espacio de nombres de espacio de nombres clr cuando el servicio de generación de proxies. Yo uso un fuerte control de versiones de los espacios de nombres y, por tanto, se generan espacios de nombres clr son torpes, y puede significar muchas de lado de cliente de los cambios de código si el wsdl y xsd espacio de nombres de los cambios de versión. Un ejemplo de código sería mejor mostrar lo que yo quiero.

//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 – sin espacio de nombres de asignación de

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

El proxy generado parece

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

El cliente las clases son de cualquier espacio de nombres. Cualquier cambio xsd espacio de nombres implicaría cambiar todas las instrucciones de uso en mi código de cliente de todos construir se va a romper.

2. svcutil – con comodín espacio de nombres de asignación de

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

El proxy generado parece

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

Aviso que svcutil ha cambiado automáticamente una de las Direcciones de clase a 1. No me gusta esto. Cliente todas las clases están también dentro del mismo espacio de nombres.

Lo que quiero

Algo como esto:

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

De esta forma, se pueden agrupar de forma lógica el espacio de nombres clr y que cualquier cambio en wsdl y xsd espacio de nombres que se maneja en la generación de proxy sólo sin afectar el resto del lado del cliente código.

Ahora esto no es posible. El svcutil permite asignar sólo a uno o a todos los espacios de nombres, no de una lista de asignaciones.

Puedo hacer un mapeo, como se muestra a continuación, pero no varios

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

Pero, ¿hay alguna solución. Svcutil no es magia, está escrito en .Neto y de manera programática de la generación de los proxies. Nadie ha escrito una alternativa a svcutil o me apunte a las direcciones para que yo pueda escribir.

¿Qué sucede si usted sólo tiene que utilizar «Agregar Referencia de Servicio»?
Yo no lo he probado ya que tengo que usar el svcutil para generar el proxy de dll. Pero supongo que dado que «agregar referencia de servicio» tiene la opción de entrada de sólo un espacio de nombres sería la misma como comodín, la asignación de espacio de nombres.

OriginalEl autor softveda | 2009-07-09

2 Kommentare

  1. 20

    Se pueden hacer múltiples asignaciones de espacio de nombres por ofrecer más espacio de nombres de parámetros — no por el punto y coma separa de ellos. Así que tu ejemplo debería ser

    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

    Aunque, actualmente estoy teniendo problemas en donde los tipos generados a partir de .archivos xsd que no son afectados por estos espacios de nombres. Sólo los tipos generados a partir de la .los archivos wsdl. La documentación que se supone que deben ser.

    De suerte conseguir que el espacio de la asignación a afectar el xsd tipos así?
    Yo no perseguir mucho más en el tiempo. Terminamos evitando la necesidad de xsd mediante la incorporación de esos tipos en el wsdls creo. (Ha sido 3 años, en los que la mente.) Tal vez VS2010 mejoró esta situación? Lo anterior se hizo con VS2008.
    Otro par de años pasan, y todavía estoy pegando este mismo problema en VS2013 🙁
    Me estoy enfrentando este problema sólo cuando se utiliza el modificador /serializador:XmlSerializer. Para DataContractSerializer los tipos son corectly incluidos en los espacios de nombres especificado. De acuerdo a este respuesta XmlSerializer no admite esta característica.

    OriginalEl autor Dave Cameron

  2. 1

    Sólo en caso de que usted desee asignar todos los espacios de nombres de esquemas para un espacio de nombres CLR a continuación :

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

    OriginalEl autor Hakam Fostok

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea