2010-02-23 19 views
5

Estoy intentando usar encabezados SOAP para permitir la Autenticación SQL al acceder a un servicio web publicado en mi casilla SQL 2005 a través de HTTP Endpoint. En el punto final, configuré Autenticación = (Básico), Puertos = (SSL) y LOGIN_TYPE = MIXED. Puedo generar el WSDL y consumirlo bien en VS utilizando credenciales de dominio. Sin embargo, cuando trato de implementar encabezados SOAP para permitir la Autenticación de SQL, me encuentro con problemas. Seguí MS BOL a la carta (http://msdn.microsoft.com/en-us/library/ms189619(SQL.90).aspx), pero por alguna razón, no estoy enviando el encabezado SOAP. Lo he verificado mediante el uso de violinista (http://www.fiddler2.com/fiddler2/) para atrapar mis mensajes https y mirarlos. Cualquier ayuda sería muy apreciada. Se incluye el código He estado usando (los nombres han sido cambiados para proteger a los inocentes)Agregar encabezados SOAP para el servicio web HTTP Endpoint de SQL 2005 en Visual Studio 2008

namespace ConsoleApplication.WebService 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     //Prevents error due to self signed cert 
     ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

     Stuff stuff = new Stuff(); 

     stuff.DoSomthing(); 
    } 
} 

public class Stuff 
{ 
    [System.Web.Services.Protocols.SoapHeaderAttribute("sqlSecurity")] 
    public int DoSomthing() 
    { 
     Webservice ws = new Webservice(); 

     CredentialCache myCreds = new CredentialCache(); 
     myCreds.Add(new Uri(ws.Url), "Basic", new NetworkCredential("netaccount", "netpass", "domain")); 
     ws.Credentials = myCreds; 

     ws.sqlSecurity = new SqlSoapHeader.Security(); 
     ws.sqlSecurity.Username = "sqluser"; 
     ws.sqlSecurity.Password = "sqlpass"; 

     try 
     { 
      ws.SelectUserAccountByUserName("someuser"); 
     } 
     catch (SoapException ex) 
     { 

      string txterror = ex.Detail.InnerText; 
      return 0; 
     } 

     return 1; 
    } 
} 

public partial class Webservice 
{ 
    public SqlSoapHeader.Security sqlSecurity; 
} 
} 

Este código utiliza la clase SqlSoapHeader como se documenta en la referencia BOL desde arriba.

Error al llamar a ws.SelectUserAccountByUserName() con un "Permiso de ejecución denegado" debido al hecho de que el usuario "netaccount" no tiene derechos para ejecutar el proceso almacenado. Pero de nuevo, esto se debe a que según el mensaje de jabón, no se está pasando ningún encabezado con la información de sqluser.

Respuesta

3

El SoapHeaderAttribute se debe agregar al método web. No le servirá de nada agregarlo a algún método de llamadas arbitrarias.

+0

Esto es genial! Cuélgalo para mí siendo un programador novato. Ahora una pregunta más importante es ¿cómo evito que se sobrescriba cada vez que actualizo la referencia web? Va a consumir mucho tiempo y ser molesto tener que agregar docenas de atributos cada vez que cambie el wsdl. –

+0

@Leifab: si tiene control sobre WSDL, puede indicar al código-gen que lo agregue automáticamente; No estoy íntimamente familiarizado con los servicios web XML nativos de SQL Server, pero no parece que tenga mucho control sobre los metadatos que genera, por lo que me temo que no tenga suerte. En el pasado, utilicé las extensiones de WSE para afectar el código generado, pero al utilizar WebServices simples no estoy seguro de cómo hacerlo (o si es posible). Ojalá pudiera contarte más ... – Aaronaught

Cuestiones relacionadas