Connecting to SalesForce bulk API using C#

2019-04-09 13:13发布

问题:

I am trying to connect to the SalesForce.com bulk API so I can do mass uploads of data from my application. I have read through the PDF documentation which emphasizes using CURL to make the POST requests. In keeping with the instructions, I have created a text file in XML format which is used for logging into the server.

Login.txt contents below:

<?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>

Here is what I'm trying to do in my code to make the login request:

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();
}

When this code executes I always get a 500 error. Does anyone have any experience in doing what I am attempting to do? Could you please provide me with some suggestions?

Thank you in advance.

回答1:

For the login part, just download and import the partner WSDL and use the generated web service client. Otherwise, you'll want to update your code to read the response when it gets a 500 status code (the SOAP spec requires fault messages to use a 500 status code), the response body will give you more clues to the problem. I'd expect in this case you're getting an identity confirmation error, and you'll need to provide your api security token in addition to your password in the login request.



回答2:

Generate the XML file to salesforce login

<?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>

use the following c# code for login to 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);


标签: c# salesforce