2011-08-17 8 views
7

Tengo un problema al llamar a una solicitud de servicio web en C#.Pre autenticar solicitud de servicio web en C#

El servicio y la solicitud funcionan bien en la interfaz de usuario de Soap con la opción 'Authenticate Preemptively' habilitada (Archivo, Preferencias, Configuración de HTTP). Sin esta configuración habilitada, el servicio devuelve una 'Java.Lang.NullPointerException'.

El problema que tengo es que no sé cómo habilitar esta configuración en un contexto C#.

Tengo una biblioteca de clases .NET 3.5 que contiene una llamada referencia de servicio para el servicio específico. Este es un fragmento de código simple;

try 
{ 
    CatalogService.CatalogChangeClient service = new CatalogService.CatalogChangeClient(); 
    service.ClientCredentials.UserName.UserName = "fancydress"; 
    service.ClientCredentials.UserName.Password = "47fda9cb4b51a9e"; 
    service.ClientCredentials.SupportInteractive = true; 

    ProductUpdate[] products = new ProductUpdate[1]; 
    products[0] = new ProductUpdate(); 
    products[0].ProductCode = "00001"; 
    products[0].ProductDescription = "TestProduct"; 

    string result = service.UpdateProducts(products); 
} 
catch (Exception exception) 
{ 
    Console.WriteLine(exception.Message); 
} 

Actualizar después de la primera respuesta.

La clase CatalogService.CatalogChangeClient parece implementar la clase abstracta WCF

System.ServiceModel.ClientBase<TChannel> 

End Actualizar

Podría alguien ayudarme a esta propiedad?

+0

favor muestran más código esp. la interfaz 'CatalogService.CatalogChangeClient' implementa – Yahia

+0

Parece ser que la implementación de la clase System.ServiceModel.ClientBase de WCF: CatalogChangeClient clase parcial pública: System.ServiceModel.ClientBase , Fancydress. ResourceAccess.MCSF.CatalogService.CatalogChange –

+1

Por lo que veo, este es un problema en la implementación .NET que envía la solicitud y solo cuando obtiene un 401 de los servicios reenvía con credenciales ... su servicio web Java no parece enviar 401 - aunque primero debe confirmar que realmente es el caso (es decir, WireShark) ... SI es el caso: para eludir esto, sospecho que tendrá que utilizar un cliente diferente (proxy) que puede ser "engañado" para enviar el credenciales siempre ... – Yahia

Respuesta

5

Puede intentar y anular el método GetWebRequest desde el tallo del cliente generado.

Lo he usado una vez y eso resolvió mi problema. Mira lo siguiente: http://www.eggheadcafe.com/community/wcf/18/10056093/consuming-webservices-and-http-basic-authentication.aspx Desplaza un poco hacia abajo.

Aquí está el código del enlace:

protected override System.Net.WebRequest GetWebRequest(Uri uri) 
{ 
    HttpWebRequest request; 
    request = (HttpWebRequest)base.GetWebRequest(uri); 

    if (PreAuthenticate) 
    { 
     NetworkCredential networkCredentials = 
      Credentials.GetCredential(uri, "Basic"); 

     if (networkCredentials != null) 
     { 
      byte[] credentialBuffer = new UTF8Encoding().GetBytes(
       networkCredentials.UserName + ":" + 
       networkCredentials.Password); 
      request.Headers["Authorization"] = 
       "Basic" + Convert.ToBase64String(credentialBuffer); 
     } 
     else 
     { 
      throw new ApplicationException("No network credentials"); 
     } 
    } 
    return request; 
} 
+1

Hay un buen artículo en [.NET WebRequest.PreAuthenticate - no es lo que parece] (http://www.west-wind.com/weblog/posts/2010/Feb/18/NET-WebRequestPreAuthenticate-not-quite -what-it-sounds-like) que describe su respuesta y otras opciones con mucho más detalle. – ChrisW

+1

Creo que necesitas un espacio extra: request.Headers ["Authorization"] = "Basic" + ... pero de lo contrario +1 –

+0

@Julia Hayward - Es cierto, debería haber estado allí. –

Cuestiones relacionadas