net create crear asp and c# json windows-phone windows-phone-8.1

c# - create - devolviendo un falso cuando obtuve 400 estados de servicio web en JSON



web service json c# (2)

En mi archivo codebehind llamo a esta función:

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

Luego en el servicio web hago esto:

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) { } }

Lo que quiero hacer ahora es cuando se lanza una excepción, mostrar un buzón de mensajes. Y cuando obtuve un estado 200, navego a la página siguiente en el código detrás del archivo.

Mi pregunta es ahora, ¿cómo voy a saber esto en mi código detrás del archivo?

¡Muchas gracias de antemano!

EDITAR También tengo estos métodos de ayuda:

#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


Como está obteniendo una respuesta de Json, le recomendamos que agregue el paquete Newtonsoft nuget a su proyecto primero.
Ahora antes solíamos agregar una referencia de servicio, pero ahora podemos hacerlo fácilmente usando

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; } } }

Ahora lo más importante para el espacio de nombres utilizado debe ser

using System.Net.Http;

y no

using Windows.Web.Http;


El siguiente código usa la API Windows.Web.Http.HttpClient (Microsoft recomienda usar esta API para conectar el servicio REST)

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; }

En su código detrás:

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 }