2017-03-07 5 views
3

Ich habe einige vorhandenen Code, der funktionierte und plötzlich beendet wurde.C# REST API Call - Arbeiten in Postman, nicht in Code

ich kann nicht herausfinden, warum ...

Hier ist mein Code:

public static string RequestToken(string u, string pw) 
    { 
     string result = string.Empty; 

     string strUrl = "https://xxx.cloudforce.com/services/oauth2/token?grant_type=password&client_id=XXXX&client_secret=XXXX&username=" + u + "&password=" + pw; 
     HttpWebRequest tokenRequest = WebRequest.Create(strUrl) as HttpWebRequest; 
     Debug.Print(strUrl); 
     tokenRequest.Method = "POST"; 
     try 
     { 
      using (HttpWebResponse tokenResponse = tokenRequest.GetResponse() as HttpWebResponse) 
      { 
       if (tokenResponse.StatusCode != HttpStatusCode.OK) 
        throw new Exception(String.Format(
         "Server error (HTTP {0}: {1}).", 
         tokenResponse.StatusCode, 
         tokenResponse.StatusDescription)); 
       DataContractJsonSerializer jsonSerializer2 = 
        new DataContractJsonSerializer(typeof(ResponseAuthentication)); 
       object objTokenResponse = jsonSerializer2.ReadObject(tokenResponse.GetResponseStream()); 
       ResponseAuthentication jsonResponseAuthentication = objTokenResponse as ResponseAuthentication; 
       result = jsonResponseAuthentication.strAccessToken; 
      } 
     } 
     catch (Exception ex) 
     { 
      Debug.Print(ex.InnerException.ToString()); 
     } 
     return result; 
    } 

ich jetzt immer ein 500 Internal Server Error wo vorher sauber gearbeitet hat.

Wenn ich versuche, mit Postman debuggen, übergebe ich die URL direkt und es funktioniert gut. Selbst wenn ich im Code stoppe und die exakt gleiche URL verwende, die dann innerhalb des Codes fehlschlägt, funktioniert sie in Postman, aber nicht in C#.

Aus Postman, erhalte ich eine geordnete ...

{ 
    "access_token": "XXXXXX", 
    "instance_url": "https://xxx.cloudforce.com", 
    "id": "https://login.salesforce.com/id/XXXXXX", 
    "token_type": "Bearer", 
    "issued_at": "XXXXXX", 
    "signature": "XXXXXX" 
} 

Um zu klären, ich habe versucht, eine GET Anfrage statt POST und ich erhalten die folgende Antwort (in Postman):

{ 
    "error": "invalid_request", 
    "error_description": "must use HTTP POST" 
} 

Irgendwelche Ideen hier?

+0

Sind Sie sicher, Methodentyp sollte "POST" sein? – levent

+0

@levent - Ja, das ist es, was ich auch in Postman verwende ... GET funktioniert NICHT. – gotmike

+0

Was ist request.contentType beim Postman-Erfolgsfall? – levent

Antwort

7

Die Antwort endete damit, dass Salesforce die Unterstützung für TLS 1.0 beendet hat, was in .NET 4.5 der Standard ist.

In diesem Link erwähnen sie, dass dies im Juli 2017 passieren sollte, aber irgendwie traf es unsere Instanz früh. https://help.salesforce.com/articleView?id=000221207&type=1

Wir bestätigten später, dass es 4.6 .NET arbeiten würde, aber nicht in 4,5 ...

Stellt sich heraus, 1.2 .NET 4.6 verwendet standardmäßig TLS.

Es war eine sehr einfache Lösung, die lange brauchte, um herauszufinden.

diese eine Zeile Code hinzugefügt und es funktionierte sofort:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

Hoffnung, dass jemand anderes mit dem gleichen Problem hilft!

Ein wenig frustrierend, wenn so eine einfache One-Line-Lösung Tage braucht, um zu finden.

+0

Vielen Dank für Ihre Rettung. Ich wünschte, ich könnte mehr als einmal upvote. – Saurabh

+0

DANKE !!!!!!! – Gaspa79

+0

Wo haben Sie diese Zeile hinzugefügt? –