2010-02-23 10 views
5

Sto cercando di utilizzare le intestazioni SOAP per consentire l'autenticazione SQL durante l'accesso a un servizio Web pubblicato sulla mia casella SQL 2005 tramite HTTP Endpoint. Sull'endpoint, ho impostato Authentication = (Base), Ports = (SSL) e LOGIN_TYPE = MIXED. Sono in grado di generare il WSDL e consumarlo bene in VS utilizzando le credenziali di dominio. Tuttavia, quando provo a implementare le intestazioni SOAP per consentire l'autenticazione SQL, sto incontrando problemi. Ho seguito MS BOL alla lettera (http://msdn.microsoft.com/en-us/library/ms189619(SQL.90).aspx), ma per qualche motivo, non sto inviando l'intestazione SOAP. Ho verificato questo utilizzando il violinista (http://www.fiddler2.com/fiddler2/) per intercettare i miei messaggi https e guardarli. Qualsiasi aiuto sarebbe molto apprezzato. Incluso è il codice che ho usato (i nomi sono stati cambiati per proteggere gli innocenti)Aggiunta di intestazioni SOAP per il servizio Web SQL Endpoint HTTP 2005 in 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; 
} 
} 

Questo codice utilizza la classe SqlSoapHeader come documentato nel riferimento BOL dall'alto.

Errore a chiamare ws.SelectUserAccountByUserName() con un "Esegui autorizzazione negata" a causa del fatto che l'utente "netaccount" non ha i diritti per eseguire il proc memorizzato. Ma ancora una volta, questo è perché secondo il messaggio soap, non viene passata alcuna intestazione con le informazioni sqluser.

risposta

3

deve essere aggiunto allo metodo web. Non ti sarà utile aggiungerlo a un metodo di chiamata arbitrario.

+0

Questo è fantastico! Chock up me essendo un programmatore novizio. Ora una domanda più grande è come impedire che questo venga sovrascritto ogni volta che aggiorno il riferimento Web? Sarà molto dispendioso in termini di tempo e fastidioso dover aggiungere dozzine di attributi ogni volta che wsdl cambia. –

+0

@Leifab: se si ha il controllo sul WSDL, è possibile indicare al code-gen di aggiungerlo automaticamente; Non ho familiarità con i servizi Web XML nativi di SQL Server, ma non sembra che tu abbia molto controllo sui metadati che genera, quindi temo che potresti essere sfortunato. In passato ho usato le estensioni WSE per influenzare il codice generato, ma usando semplici WebServices non sono sicuro di come procedere (o se è addirittura possibile). Vorrei poterti dire di più ... – Aaronaught

Problemi correlati