2010-12-01 20 views
4

J'essaie de me connecter à l'API groupée SalesForce.com pour pouvoir effectuer des téléchargements groupés de données à partir de mon application. J'ai lu le PDF documentation qui insiste sur l'utilisation de CURL pour faire les requêtes POST. Conformément aux instructions, j'ai créé un fichier texte au format XML qui est utilisé pour se connecter au serveur.Connexion à l'API groupée SalesForce à l'aide de C#

contenu login.txt ci-dessous:

<?xml version="1.0" encoding="utf-8" ?> 
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> 
    <env:Body> 
    <n1:login xmlns:n1="urn:partner.soap.sforce.com"> 
      <n1:username>my username</n1:username> 
     <n1:password>my password</n1:password> 
    </n1:login> 
    </env:Body> 
</env:Envelope> 

Voici ce que je suis en train de faire dans mon code pour faire la demande de connexion:

XmlDocument XMLResponse = null; 

HttpWebRequest httpRequest; 

HttpWebResponse httpResponse = null; 

Stream requestStream = null; 
Stream responseStream = null; 

XmlTextReader xmlReader; 

httpRequest = HttpWebRequest)WebRequest.Create("https://login.salesforce.com/services/Soap/c/20.0"); 

try 
{ 
      byte[] bytes = File.ReadAllBytes(filename); 
      httpRequest.Method = "POST"; 
      httpRequest.ContentLength = bytes.Length; 
      httpRequest.ContentType = "text/xml; charset=UTF-8"; 
      httpRequest.Headers.Add("SOAPAction: login"); 
      requestStream = httpRequest.GetRequestStream(); 
      requestStream.Write(bytes, 0, bytes.Length); 
      requestStream.Close(); 

      httpResponse = (HttpWebResponse)httpRequest.GetResponse(); 

      if (httpResponse.StatusCode == HttpStatusCode.OK) 
      { 
       responseStream = httpResponse.GetResponseStream(); 

       xmlReader = new XmlTextReader(responseStream); 

       XmlDocument xmldoc = new XmlDocument(); 
       xmldoc.Load(xmlReader); 

       XMLResponse = xmldoc; 
       xmlReader.Close(); 
      } 

      httpResponse.Close(); 
} 

Lorsque ce code est exécuté, je reçois toujours un 500 erreur. Est-ce que quelqu'un a une expérience de faire ce que je tente de faire? Pourriez-vous s'il vous plaît me fournir quelques suggestions?

Merci d'avance.

Répondre

3

Pour la partie de connexion, il suffit de télécharger et d'importer le partenaire WSDL et d'utiliser le client de service Web généré. Sinon, vous devrez mettre à jour votre code pour lire la réponse quand il recevra un code d'état 500 (la spécification SOAP exige des messages d'erreur pour utiliser un code d'état 500), le corps de la réponse vous donnera plus d'indices. Dans ce cas, j'attends une erreur de confirmation d'identité, et vous devrez fournir votre jeton de sécurité api en plus de votre mot de passe dans la demande de connexion.

+0

Comment puis-je lire la réponse? Dès que .GetResponse() est appelé, il m'envoie à mon bloc catch avec l'exception générique 500, qui n'a pas d'InnerException. – Adam

+0

WebException inclut une propriété Response que vous pouvez utiliser pour accéder à la réponse dans le cas d'exception. – superfell

+0

Merci pour la suggestion! Maintenant, quand j'examine la réponse, j'obtiens le message d'erreur suivant: "La requête SOAP doit utiliser SOAP 1.1, n'a pas reçu une enveloppe SOAP 1.1 comme racine du document". Je n'ai pas vraiment d'expérience dans l'utilisation de SOAP, alors est-ce que vous pourriez voir quelque chose dans le code que j'ai posté ci-dessus qui expliquerait ce problème? – Adam

3

Générer le fichier XML connexion Salesforce

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <login xmlns="urn:enterprise.soap.sforce.com"> 
     <username>username</username> 
     <password>password + token</password> 
    </login> 
    </soap:Body> 
</soap:Envelope> 

utiliser le code C# suivant pour se connecter à SalesForce

XmlDocument doc = new XmlDocument(); 
       doc.LoadXml(str); 
       string uri = "https://login.salesforce.com/services/Soap/c/21.0"; 
       HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri); 
       req.Headers.Add("SOAPAction", "login"); 
       req.ContentType = "text/xml;charset=\"utf-8\""; 
       req.Accept = "text/xml"; 
       req.Method = "POST"; 
       stm = req.GetRequestStream(); 
       doc.Save(stm); 
       stm.Close(); 
       WebResponse resp = req.GetResponse(); 
       stm = resp.GetResponseStream(); 
       XmlDocument doc1 = new XmlDocument(); 
       doc1.Load(stm);