2015-05-05 8 views
17

में वेब सेवा के 400 स्थिति मिला मेरी codebehind फ़ाइल में मैं इस समारोह फोन:एक झूठी लौटने जब JSON

private void loginAction(object sender, TappedRoutedEventArgs e) 
{ 
    Webservice webservice = new Webservice(); 
    webservice.getUser(txtLogin.Text, txtPass.Text); 
} 
तब वेब सेवा में

मैं यह कर:

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

    } 
} 

मैं अब क्या करना चाहते हैं क्या जब एक अपवाद फेंक दिया जाता है, तो एक संदेशबॉक्स दिखाएं। और जब मुझे एक स्टेटस 200 मिला तो मैं फ़ाइल के पीछे कोड में अगले पृष्ठ पर नेविगेट करता हूं।

मेरा प्रश्न अब है, मैं फ़ाइल के पीछे अपने कोड में यह कैसे जानूंगा?

अग्रिम में बहुत धन्यवाद!

संपादित मैं भी इन सहायक तरीकों:

#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

होना चाहिए नाम स्थान के लिए सबसे महत्वपूर्ण जरिए कर सकते हैं HttpWebResponse में स्टेटस कोड – csharpwinphonexaml

+0

@csharpwinphonexaml नामक एक प्रॉपर्टी है जिसे मैं अपने JSON में कोड वापस प्राप्त करता हूं। लेकिन मेरे पास एक और सवाल है। अब मैं अपने लॉगिन फ़ंक्शन पर कार्य। फैक्टरी का उपयोग कर रहा हूं। लेकिन यह httpWebRequest.BeginGetResponse (कॉलबैक, httpWebRequest) पर रुक जाता है; क्या आपको कोई विचार है कि मैं इसे कैसे हल कर सकता हूं? – Steaphann

+0

Windows.Web.Http.HttpClient का उपयोग क्यों नहीं करें? –

उत्तर

6

कोड bellow उपयोग एपीआई Windows.Web.Http.HttpClient

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

अपने कोड में (माइक्रोसॉफ्ट बाकी सेवा से कनेक्ट करने के लिए इस एपीआई का उपयोग करने की सलाह देते हैं) पीछे:

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

यूआरएल मुझे एक JSON वापस दे रहा है। क्या यह तब काम करेगा? – Steaphann

+0

बेशक, यह पंक्ति प्रतिक्रिया सामग्री पढ़ रही है: "data.Data = परिणाम का इंतजार कर रहा है। सामग्री। रीडएएसस्ट्रिंगएसिंक()" –

+0

जब मैं कक्षा परिणाम जोड़ने का प्रयास करता हूं तो मैं लाल रेखाएं दिखाता हूं। और फिर मैं इसे सार्वजनिक विंडोज़ में हल कर सकता हूं। Web.Http.HttpStatusCode स्थिति {प्राप्त करें; सेट; } – Steaphann

1

चूंकि आपको जेसन प्रतिक्रिया मिल रही है, तो आप पहले अपनी परियोजना में न्यूटॉन्सॉफ्ट न्यूज पैकेज जोड़ने की सलाह देंगे।
अब पहले हम एक सेवा संदर्भ जोड़ने के लिए प्रयोग किया जाता है, लेकिन अब हम आसानी से यह

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

अब इस्तेमाल किया

using System.Net.Http; 

और नहीं

using Windows.Web.Http; 
संबंधित मुद्दे