2017-12-28 12 views
0

Ich bin nicht übermäßig genial mit meinem C#, aber ich hoffte, wenn jemand mir mit meinem Code-Schnipsel hier helfen könnte. Erste funktioniert gut in C# Full .net-Framework, die zweite ist, wo ich versuchte, die erste über dotnet Kern (Standard 1.3) zu ändern, aber es funktioniert einfach nicht und scheint auf "mit (Stream-Stream = response.GetResponseStream()) "with" "errorMessage": "Der entfernte Server hat eine error: (400) Bad Request zurückgegeben.", aber keine Ahnung warum. Ich nehme an, es hat etwas mit den * async-Anrufen zu tun, aber wirklich nicht sicher.Convert C# von Full Framework zu Core mit WebRequest

Vielen Dank schon und Hilfe wird sehr geschätzt.

public static string AcquireTokenBySpn(string tenantId, string clientId, string clientSecret) 
     { 
      var payload = String.Format(SpnPayload, WebUtility.UrlEncode(ArmResource), WebUtility.UrlEncode(clientId), 
       WebUtility.UrlEncode(clientSecret)); 

      byte[] data = Encoding.ASCII.GetBytes(payload); 

      var address = String.Format(TokenEndpoint, tenantId); 
      WebRequest request = WebRequest.Create(address); 
      request.Method = "POST"; 

      request.ContentType = "application/x-www-form-urlencoded"; 
      request.ContentLength = data.Length; 
      using (Stream stream = request.GetRequestStream()) 
      { 
       stream.Write(data, 0, data.Length); 
      } 

      string responseContent = null; 

      using (WebResponse response = request.GetResponse()) 
      { 
       using (Stream stream = response.GetResponseStream()) 
       { 
        if (stream != null) 
         using (StreamReader sr99 = new StreamReader(stream)) 
         { 
          responseContent = sr99.ReadToEnd(); 
         } 
       } 
      } 

      JObject jObject = JObject.Parse(responseContent); 

      return (string)jObject["access_token"]; 
     } 

Dies ist der "Kern Schnipsel".

public static async Task<string> AcquireTokenBySpn(string tenantId, string clientId, string clientSecret, double apiVersion) 
    { 
     var payload = String.Format(SpnPayload, WebUtility.UrlEncode(clientId), 
     WebUtility.UrlEncode(clientSecret)); 

     var data = Encoding.ASCII.GetBytes(payload); 

     var address = String.Format(TokenEndpoint, tenantId, apiVersion); 

     WebRequest request = WebRequest.Create(address); 

     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     //request. ContentLength = data.Length; 
     using (Stream stream = await request.GetRequestStreamAsync()) 
     { 
     stream.Write(data, 0, data.Length); 
     } 

     string responseContent = null; 

     using (WebResponse response = await request.GetResponseAsync()) 
     { 
     using (Stream stream = response.GetResponseStream()) 
     { 
      if (stream != null) 
      using (StreamReader sr99 = new StreamReader(stream)) 
      { 
       responseContent = sr99.ReadToEnd(); 
      } 
     } 
     } 

     JObject jObject = JObject.Parse(responseContent); 

     return (string)jObject["access_token"]; 
    } 
    } 
+0

Haben Sie überprüft, ob die URL und der Text der Anfrage korrekt sind? Ich stelle fest, dass die Codes \t 'Nutzlast' und' Adresse' nicht identisch sind. – skyoxZ

Antwort

0

Der Fehler ist sicher zu GetResponseAsync() bezogen. Sie müssen überprüfen, was da drüben passiert. BTW. Es ist viel besser mit .NETCore 2.0 als mit 1.3 zu arbeiten, da es eine große Bibliothek unterstützt, da es .NET Standard 2.0 Bibliotheken unterstützt.

+0

Ich führe dies innerhalb von AWS Lambda, die IIRC 2.0 noch nicht unterstützt. –

+0

Sie können die Plattform auswählen, die Sie in der Serverless-Funktion von AWS ausführen. Ich habe keine solche Option in Azure Funktion sicher gesehen. –

Verwandte Themen