2016-05-11 23 views
0

Nachdem ich eine App mit der PCL-Methode in Xamarin erstellt habe und sie 100% mit Standard-HTTP funktionierte, habe ich jetzt den Remote-Test-Server so geändert, dass SSL mit selbstsignierten Zertifikaten verwendet wird.WebRequest gibt 404 zurück, wenn zu SSL gewechselt wird

Die App kontaktiert eine benutzerdefinierte API für die Anmeldung bei einem Server und die Abfrage bestimmter Daten.

Ich habe die App geändert jetzt bei SSL suchen und bekam zunächst einen Fehler in Bezug auf Authentifizierung nicht oder etwas arbeiten, aber unter Verwendung zum Testen von SSL-Fehler ausgeschaltet:

ServicePointManager.ServerCertificateValidationCallback += (o, certificate, chain, errors) => true; 

in meinen AppDelegate Dateien FinishedLaunching Methode, die bin über diesen Fehler hinweggekommen.

Ich erhalte jetzt einen 404/Protokollfehler, wenn ich versuche, meinen Login POST zu der angegebenen URL zu machen.

Ich benutze HttpWebRequest für meine RESTful Anrufe und das funktioniert gut, wenn ich zurück zu einfachen http.

Nicht sicher warum, aber einige Artikel vorgeschlagen, mit ModernHttpClient, was ich tat. Ich importierte die Komponente (auch das Paket mit NuGet hinzugefügt) ohne Erfolg.

Fehle ich etwas anderes, das ich in meinem Code im Zusammenhang mit httpwebresponse konfigurieren sollte, wenn ich den SSL-Server kontaktiere oder ist diese Komponente einfach nicht in der Lage, mit einem SSL-Server zu sprechen?

Meine Login-Funktion ist wie folgt (Unrelated Code entfernt/verschleierten):

public JsonUser postLogin(string csrfToken, string partnerId, string username, string password){ 
     string userEndPoint = SingletonAppSettngs.Instance().apiEndPoint; 
     userEndPoint = userEndPoint.Replace ("druid/", ""); 

     var request = WebRequest.CreateHttp(string.Format(this.apiBaseUrl + userEndPoint + @"user/login.json")); 

     // Request header collection set up 
     request.ContentType = "application/json"; 
     request.Headers.Add ("X-CSRF-Token", csrfToken); 

     // Add other configs 
     request.Method = "POST"; 

     using (var streamWriter = new StreamWriter(request.GetRequestStream())) 
     { 
      string json_body_content = "{\"username\":\"" + username + "\",\"password\":\"" + password + "\"}"; 

      streamWriter.Write(json_body_content); 
      streamWriter.Flush(); 
      streamWriter.Close(); 
     } 

     try{ 
      HttpWebResponse httpResponse = (HttpWebResponse)request.GetResponse(); 

      using (StreamReader reader = new StreamReader (httpResponse.GetResponseStream())) { 
       var content = reader.ReadToEnd(); 
       content = content.Replace ("[],", "null,"); 
       content = content.Replace ("[]", "null"); 

       if (content == null) { 
        throw new Exception ("request_post_login - content is NULL"); 

       } else { 
        JsonSerializerSettings jss = new JsonSerializerSettings(); 
        jss.NullValueHandling = NullValueHandling.Ignore; 

        JsonUser deserializedUser = JsonConvert.DeserializeObject<JsonUser>(content, jss); 
        if(content.Contains ("Hire company admin user")){ 
         deserializedUser.user.roles.__invalid_name__5 = "Hire company admin user"; 
         deserializedUser.user.roles.__invalid_name__2 = "authenticated user"; 
        } 

        return deserializedUser; 
       } 
      } 
     }catch(Exception httpEx){ 
      Console.WriteLine ("httpEx Exception: " + httpEx.Message); 
      Console.WriteLine ("httpEx Inner Exception: " + httpEx.InnerException.Message); 
      JsonUser JsonUserError = new JsonUser(); 
      JsonUserError.ErrorMessage = "Error occured: " + httpEx.Message; 
      return JsonUserError; 
     } 

    } 

Antwort

0

Anzahl der Dinge, die ich tun musste, um diese an die Arbeit.

  1. Das Selbst signiertes Zertifikat 1.2 TLS
  2. Da die API ist Drupal basiert, hatte auf dem Server und einem Modul installiert verwalten die HTTP-spezifischen Seiten aktiviert werden HTTPS zuzulassen hatte.
0

Wenn eine Web-Anfrage mit ModernHttpClient machen, ich das Muster unter der Regel folgen. Eine andere großartige Bibliothek, die von Paul Betts erstellt wurde, ist refit, und kann verwendet werden, um Ruheanrufe zu vereinfachen.

using (var client = new HttpClient(new NativeMessageHandler(false, false))) 
    { 
     client.BaseAddress = new Uri(BaseUrl, UriKind.Absolute); 

     var result = await Refit.RestService.For<IRestApi>(client).GetData(); 

    } 

Der zweite Parameter für NativeMessageHandler sollte auf true gesetzt werden, wenn ein customSSLVerification verwenden.

Hier ist ein Blick auf IRestApi

public interface IRestApi 
    { 
     [Get("/foo/bar")] 
     Task<Result> GetMovies(); 
    }