lis
23
2017
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:
- Logujemy się do SF (najlepiej najpierw działać na sandboxie), wchodzimy do Setup->Quick Find->Custom Code->API
- Klikamy w Generate Enterprise WSDL, otrzymany XML zapisujemy sobie gdzieś np. w projekcie
- 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ę
- 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...
- 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.
- 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.
- 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.