Saltar al contenido

Llamar a un servicio SOAP en .net Core

Hola, hallamos la respuesta a lo que andabas buscando, deslízate y la obtendrás a continuación.

Solución:

Ok, esta respuesta es para aquellos que intentan conectarse a un WCF Servicio desde un .net Core proyecto.

Aquí está la solución para mi problema, utilizando la nueva sintaxis / biblioteca de .net Core WCF.

BasicHttpBinding basicHttpBinding = null;
EndpointAddress endpointAddress = null;
ChannelFactory factory = null;
IAService serviceProxy = null;

try

    basicHttpBinding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
    basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
    endpointAddress = new EndpointAddress(new Uri("https://someurl.com/ws/TheEndpoint.pub.ws:AService"));
    factory = new ChannelFactory(basicHttpBinding, endpointAddress);

    factory.Credentials.UserName.UserName = "usrn";
    factory.Credentials.UserName.Password = "passw";
    serviceProxy = factory.CreateChannel();

    using (var scope = new OperationContextScope((IContextChannel)serviceProxy))
    
        var result = await serviceProxy.getSomethingAsync("id").ConfigureAwait(false);
    

    factory.Close();
    ((ICommunicationObject)serviceProxy).Close();

catch (MessageSecurityException ex)

     throw;

catch (Exception ex)

    throw;

finally

    // *** ENSURE CLEANUP (this code is at the WCF GitHub page *** \
    CloseCommunicationObjects((ICommunicationObject)serviceProxy, factory);

ACTUALIZAR

Obtuve la siguiente excepción usando el código anterior

Este OperationContextScope se está eliminando fuera de servicio.

Lo que parece ser algo que está roto (o necesita ser abordado) por el equipo de WCF.

Así que tuve que hacer lo siguiente para que funcionara (basado en este problema de GitHub)

basicHttpBinding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

factory = new ChannelFactory(basicHttpBinding, new EndpointAddress(new Uri("https://someurl.com/ws/TheEndpoint.pub.ws:AService")));
factory.Credentials.UserName.UserName = "usern";
factory.Credentials.UserName.Password = "passw";
serviceProxy = factory.CreateChannel();
((ICommunicationObject)serviceProxy).Open();
var opContext = new OperationContext((IClientChannel)serviceProxy);
var prevOpContext = OperationContext.Current; // Optional if there's no way this might already be set
OperationContext.Current = opContext;

try

    var result = await serviceProxy.getSomethingAsync("id").ConfigureAwait(false);

    // cleanup
    factory.Close();
    ((ICommunicationObject)serviceProxy).Close();

finally

  // *** ENSURE CLEANUP *** \
  CloseCommunicationObjects((ICommunicationObject)serviceProxy, factory);
  OperationContext.Current = prevOpContext; // Or set to null if you didn't capture the previous context

Pero sus requisitos probablemente serán diferentes. Entonces, aquí están los recursos que puede necesitar para ayudarlo a conectarse a su servicio WCF:

  • Núcleo de WCF .net en GitHub
  • Pruebas BasicHttpBinding
  • Pruebas ClientCredentialType

Las pruebas me ayudaron mucho, pero fueron algo difíciles de encontrar (tuve ayuda, gracias Zhenlan por responder a mi problema de wcf github)

Para consumir un servicio SOAP de .NET core, agregar un servicio conectado desde la interfaz de usuario del proyecto no funciona.

Opción 1:Utilice la CLI de dotnet-svcutil. Requisito previo: VS 2017, versión 15.5 o superior

  1. Inicie el símbolo del sistema del desarrollador VS 2017.
  2. Vaya al archivo app.csproj y agregue las siguientes referencias:

    
    
    
    
    
    
    
    
  3. Reconstruir la solución.

  4. Cambie el directorio a la ubicación de su proyecto desde el símbolo del sistema VS.
  5. ejecutar comando: svcutil SOAP_URL? wsdl; ejemplo: example.com/test/testing?wsdl Esto generará archivos de referencia y un archivo output.config en su proyecto.
  6. .Net Core no tiene ningún archivo app.config o web.config, pero el archivo output.config servirá para el enlace SOAP.

opcion 2En caso de que necesite referir más de un servicio SOAP,

  1. Cree un nuevo proyecto de biblioteca de clases, use .Net Framework 4.5.1 .Net Framework importa ya que vi que los archivos de referencia generados a partir del contrato no son correctos si .Net Framework es la última.
  2. Agregue una referencia de servicio haciendo clic derecho en Referencias.
  3. Consulte el proyecto de biblioteca de clases de su proyecto principal .Net.

Así que tuve que hacer esto y usé la herramienta de proveedor de referencia de servicios web WCF.

La aparente necesidad, de acuerdo con respuestas como las de aquí, de todos los negocios indirectos con Bindings y Factories and Proxies parecía extraña, considerando que todo esto parecía ser parte de la clase importada.

Al no poder encontrar un “Cómo” oficial sencillo, publicaré mis hallazgos sobre el mas simple configuración que pude improvisar para cumplir con mis requisitos con la autenticación implícita:

    ServiceName_PortClient client = new ServiceName_PortClient();
    //GetBindingForEndpoint returns a BasicHttpBinding
    var httpBinding = client.Endpoint.Binding as BasicHttpBinding;
    httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Digest;
    client.ClientCredentials.HttpDigest.ClientCredential = new NetworkCredential("Username", "Password", "Digest");
    var result = await client.GetResultAsync();

Ahora, si no necesita realizar ninguna autenticación, simplemente haga lo siguiente:

    ServiceName_PortClient client = new ServiceName_PortClient();
    var result = await client.GetResultAsync();

Debería ser suficiente.

los ServiceName_PortClient La clase fue generada como tal por la herramienta de importación, donde ServiceName era el nombre del servicio que estaba importando.

Por supuesto, parece estar más en el espíritu del código importado colocar la configuración en un ServiceName_PortClient clase en la línea de:

    public partial class ServiceName_PortClient
    
        static partial void ConfigureEndpoint(System.ServiceModel.Description.ServiceEndpoint serviceEndpoint, System.ServiceModel.Description.ClientCredentials clientCredentials)
        
            var httpBinding = serviceEndpoint.Binding as BasicHttpBinding;
            httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Digest;
            clientCredentials.HttpDigest.ClientCredential = new NetworkCredential("Username", "Password", "Realm");
        
    

Comentarios y calificaciones del tutorial

Puedes defender nuestro análisis mostrando un comentario y puntuándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *