2015-05-05 12 views
17

In meinem Code-Behind-Datei 400 Status webservice bekam nenne ich diese Funktion:ein falsches zurückkehrt, wenn in JSON

private void loginAction(object sender, TappedRoutedEventArgs e) 
{ 
    Webservice webservice = new Webservice(); 
    webservice.getUser(txtLogin.Text, txtPass.Text); 
} 

Dann in webservice mache ich das:

public void getUser(String user, String password) 
{ 
    String strUrl = String.Format("http://*******/nl/webservice/abc123/members/login?email={0}&password={1}",user,password); 

    startWebRequest(strUrl, loginCallback); 
} 

private async void loginCallback(IAsyncResult asyncResult) 
{ 
    try 
    { 
     ReceiveContext received = GetReceiveContextFromAsyncResult(asyncResult, "User"); 

     if (received != null && received.Status == 200) 
     { 
      await UserDataSource.AddUser(received.Data); 
     } 
     else 
     { 

      throw new Exception("failedddd"); 
     } 
    } 
    catch (Exception e) 
    { 

    } 
} 

Was ich jetzt tun will Wenn eine Ausnahme ausgelöst wird, zeigen Sie eine Nachrichtenbox an. Und wenn ich einen Status 200 habe, navigiere ich zur nächsten Seite in de code hinter file.

Meine Frage ist jetzt, wie werde ich das in meinem Code hinter Datei wissen?

Vielen Dank im Voraus!

EDIT ich auch diese Hilfsmethoden haben:

#region HELPERS 
private void startWebRequest(string url, AsyncCallback callback) 
{ 
    // HttpWebRequest.RegisterPrefix("http://",WebRequestCreator.ClientHttp); 
    HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri(url)); 

    // start the stream immediately 
    httpWebRequest.AllowReadStreamBuffering = false; 

    // asynchronously get a response 
    httpWebRequest.BeginGetResponse(callback, httpWebRequest); 
} 

private ReceiveContext GetReceiveContextFromAsyncResult(IAsyncResult asyncResult, string context) 
{ 
    // Request afleiding van de AsyncState uit het ontvangen AsyncResult 
    HttpWebRequest httpWebRequest = (HttpWebRequest)asyncResult.AsyncState; 
    HttpWebResponse httpWebResponse = null; 

    try 
    { 
     // Response afleiden uit de Resuest via de methode EndGetResponse(); 
     httpWebResponse = (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult); 

     string responseString; 
     // using == IDisposable (automatische GC) 
     using (StreamReader readStream = new StreamReader(httpWebResponse.GetResponseStream())) 
     { //Stream van de response gebruiken om een readstream te maken. 
      responseString = readStream.ReadToEnd(); 
     } 
     // Release the HttpWebResponse 
     //httpWebResponse.Dispose(); 

     return new ReceiveContext(int.Parse(responseString.Substring(10, 3)), responseString); 
    } 
    catch (WebException wex) 
    { 
     Debug.WriteLine(String.Format("{0} kon niet opgehaald worden: {1}", context, wex.Message)); 
    } 
    catch (JsonReaderException jrex) 
    { 
     Debug.WriteLine(String.Format("{0} opgehaald van server, maar de json kon niet geparsed worden: {1}", context, jrex.Message)); 
    } 
    catch (FormatException fex) 
    { 
     Debug.WriteLine(String.Format("{0} opgehaald van server, maar de gegevens kloppen niet: {1}", context, fex.Message)); 
    } 
    catch (ArgumentOutOfRangeException arex) 
    { 
     Debug.WriteLine(String.Format("{0} opgehaald van server, maar de context is leeg: {1}", context, arex.Message)); 
    } 

    return null; 
} 
public sealed class ReceiveContext 
{ 
    public ReceiveContext(int status, string data) 
    { 
     this.Status = status; 
     this.Data = data; 
    } 

    public int Status { get; private set; } 

    public string Data { get; private set; } 
} 
#endregion 
+2

früher HttpWebResponse hat eine Eigenschaft namens statusCode – csharpwinphonexaml

+0

@csharpwinphonexaml Ich bekomme den Code zurück in meinem JSON. Aber ich habe eine andere Frage. Ich verwende jetzt Task.Factory für meine Login-Funktion. Aber es stoppt auf httpWebRequest.BeginGetResponse (Callback, httpWebRequest); Hast du eine Idee, wie ich das lösen kann? – Steaphann

+0

Warum nicht Windows.Web.Http.HttpClient verwenden? –

Antwort

6

Der Code unten verwenden API Windows.Web.Http.HttpClient (Microsoft empfiehlt diese API zu verwenden REST-Service zu verbinden)

public class Result 
{ 
    public HttpStatusCode Status { get; set; } 
    public string Data { get; set; } 
} 

public async Task<Result> LoginAsync(string user, string password) 
{ 
    var http = new HttpClient(); 
    var request = new HttpRequestMessage(HttpMethod.Get, new Uri("http://*******/nl/webservice/abc123/members/login?email="+ user + "&password="+ password)); 
    var result = await http.SendRequestAsync(request); 

    var data = new Result {Status = result.StatusCode}; 
    if (result.StatusCode== HttpStatusCode.Ok && result.Content!=null) 
    { 
     data.Data = await result.Content.ReadAsStringAsync(); 
    } 
    return data; 
} 

In Ihrem Code hinten:

var result2 = await LoginAsync("", ""); 
if (result2.Status == HttpStatusCode.Ok) 
{ 
    //Status code 200 
    //navigate to other page 
} 
else if(result2.Status == HttpStatusCode.BadRequest) 
{ 
    //Status code 400 
    //your code 
} 
+0

Die URL gibt mir eine JSON zurück. Wird das funktionieren? – Steaphann

+0

Natürlich diese Zeilen lesen Antwort Inhalt: "data.Data = erwarten result.Content.ReadAsStringAsync()" –

+0

Wenn ich versuche, die Klasse hinzuzufügen, zeigt Ergebnis I die roten Linien. Und ich kann es dann zu öffentlichen Windows.Web.Http.HttpStatusCode Status {get; einstellen; } – Steaphann

1

Da Sie eine JSON-Antwort erhalten, empfehlen wir, zuerst das Newtonsoft-Nugget-Paket zu Ihrem Projekt hinzuzufügen.
Jetzt früher verwendeten wir einen Dienstverweis hinzufügen, aber jetzt können wir es leicht

Sie mit
var client = new HttpClient(); 
var response = await client.GetAsync(new Uri("http://*******/nl/webservice/abc123/members/login?email="+ user + "&password="+ password)); 
var resultlogin = await response.Content.ReadAsStringAsync(); //this is usually string type 
var obj = JsonConvert.DeserializeObject<UserLogin.RootObject>(resultbrand); 
//I usually define my own custom C# class using json2csharp.com or you can use Json.Deserialize also. 

class UserLogin 
{ 
    public class User 
    { 
     public string UserName { get; set; } 
     public string Email { get; set; } 
    } 

    public class RootObject 
    { 
     public string tag { get; set; } 
     public int success { get; set; } 
     public int error { get; set; } 
     public string uid { get; set; } 
     public User User { get; set; } 
    } 
} 

Jetzt wichtigste für den Namespace sollte

using System.Net.Http; 

und nicht

using Windows.Web.Http; 
Verwandte Themen