svcutil net mvc example dotnet consuming consume asp .net asp.net visual-studio wcf reference

.net - mvc - wcf net core 2



Actualice todas las referencias del servicio WCF con un solo clic(¡dos clics también estarían bien!) (3)

Prefiero evitar establecer referencias a los servicios WCF a través del mecanismo IDE, si puedo evitarlo. Preferiría simplemente proporcionar proxies en una biblioteca de clases separada. De esta forma, lo que sucederá normalmente es que una actualización del repositorio de código fuente romperá la compilación de la copia local y entonces será obvio que algo necesita cambiar. Después de todo, debería ser tan doloroso como cualquier cambio en la interfaz pública. No soy fanático de svcutil.exe.

Tengo varios proyectos que contienen múltiples referencias de servicio WCF.

Mis servicios de WCF están en un estado de cambio, por lo que con frecuencia tengo que ir y actualizar todas mis referencias de servicio.

¿Hay alguna forma de lograr esto como una acción única?


Bueno, en lugar de usar el IDE, ¿podrías usar svcutil en la línea de comando a través de un script de compilación? Entonces todo lo que tienes que hacer es volver a ejecutar el bat / script / whatever ...


No uso proxies generados en absoluto. Solo tengo un ensamblaje compartido entre mi cliente y el servidor que define las interfaces del contrato de servicio + la siguiente prestidigitación.

// this class can be used to instantiate a unidirectional proxy (one that doesn''t require callbacks from the server) public class UniDirectionalServiceProxy<T> : System.ServiceModel.ClientBase<T> where T : class { public UniDirectionalServiceProxy() { } public UniDirectionalServiceProxy(string endpointConfigurationName) : base(endpointConfigurationName) { } public UniDirectionalServiceProxy(string endpointConfigurationName, string remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public UniDirectionalServiceProxy(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public UniDirectionalServiceProxy(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : base(binding, remoteAddress) { } // new keyword allows us to supercede the inherited protected member and make it public. public new T Channel { get { return base.Channel; } } }

Parece familiar, ¿verdad? Construya ese objeto y luego simplemente cambie sus llamadas para usar el miembro del Canal.

También puedes usar ChannelFactory para obtener el mismo resultado (supongo que hicieron de Channel un miembro protegido de ClientBase para alentar a los desarrolladores a usar ChannelFactory), pero prefiero este mecanismo ya que terminas con un solo objeto que encapsula el control de comunicación y las llamadas a través del cable. Obviamente, de esta manera se pierden los métodos de sincronización de svcutil, pero de todos modos es bastante fácil hacerlo con los delegados.