lis
23
2017

Integracja .NET z SalesForce (SOAP)

Hej, dzisiaj poruszę temat kwestii integracji aplikacji .NET-owej z SalesForce. W naszym projekcie postanowiłem użyć API SOAP-owego, chociaż dostępne jest również API REST-owe. Dlaczego tak ? Ano, użycie API REST-owego wymaga całej złożonej autoryzacji z wykorzystaniem OAuth, co przekłada się na sporo więcej pracy do wykonania. A OAuth nie jest w naszym systemie potrzebne bo logujemy się zawsze na koncie użytkownika systemowego, nie potrzebujemy logować innych użytkowników z zewnętrznym logowaniem.

Wracając do SOAP, niestety widać wyraźnie że to API nie jest zbytnio rozwijane co widać zarówno w niekiedy archaicznej i nieaktualizowanej dokumentacji jak i różnych czasem dziwnych błędach. Wracając do meritum, przedstawiam w etapach kroki które należy zrobić aby integracja zadziałała:

  1. Logujemy się do SF (najlepiej najpierw działać na sandboxie), wchodzimy do Setup->Quick Find->Custom Code->API
  2. Klikamy w Generate Enterprise WSDL, otrzymany XML zapisujemy sobie gdzieś np. w projekcie
  3. Z otrzymanego WSDL-a tworzymy Proxy, w Visual Studio na projekcie dajemy Add Service Reference, w polu URL dajemy ścieżkę do naszego pliku WSDL np: "C:\files\wsdl.xml" i dajemy Discover, dodajemy referencję
  4. I teraz ciekawa rzecz, wygenerowane Proxy jest błędne tj. kod się będzię kompilował ale podczas łączenia się z SF będą lecieć dziwne błędy. Trzeba zrobić pewien myk: mianowicie otwieramy utworzony plik Reference.cs (uwaga! nie będzie widoczny w VS, trzeba go odszukać ręcznie) a następnie zamieniamy wszystkie wystepienia ciągu znaków "[][]" na "[]" tj. zmieniamy definicję tablic dwuwymiarowych na jednowymiarowe. Nie pytajcie dlaczego, SF twierdzi ze WSDL jest dobry, VS generuje ewidentnie zły Proxy...
  5. Teraz już jestesmy gotowi aby zalogować się do SF, poza nazwą użytkownika i hasłem potrzebujemy jeszcze URL usługi oraz SecurityTokenu. URL usługi jest w WSDL, możemy sobie go podejrzeć w web.config-u jeśli dodaliśmy Proxy przez VS. Natomiast aby otrzymać Security Token musimy wejść znowu do SF, kliknąć na ikonkę użytkownika -> Settings -> My Personal Information -> Reset Security Token. Token otrzymamy wkrótce na maila.
  6. Proces odpytywania API przebiega w sesjach, najpierw należy się zalogować, otrzymujemy sessionId, oraz url na jaki będziemy wysyłać nasze następne requesty. Requesty te wymagają każdorazowo podania sessionId. Na końcu wylogowujemy się, również podając id sesji. 
  7. Przykład:
var client = new SoapClient();
var loginRes = await client.loginAsync(new LoginScopeHeader(), _configuration.userName, _configuration.Password + _configuration.securityToken);
if (loginRes.result.passwordExpired) {
    throw new ApplicationException("Password expired");
}
var sessionHeader = new SessionHeader { sessionId = loginRes.sessionId };
var apiClient = new SoapClient(new BasicHttpsBinding(), new EndpointAddress(loginRes.result.serverUrl);

var query = "SELECT Email from Contact";
var someResults = apiClient.queryAsync(sessionHeader, null, null, null, query);
// inne wywołania

apiClient.logout(sessionHeader);
 

Należy zwrócić tu uwagę na dwie sprawy, po pierwsze przy logowaniu podajemy hasło złączone z Security Tokenem. Po drugie tworzymy dwa SoapClient-y z różnymi url-ami. Ten pierwszy służy tylko po to żeby sie zalogować oraz uzyskać

Url właściwy do który będziemy wykorzystywać przy właściwych wywołaniach API.