【问题标题】:returning a false when got 400 status of webservice in JSON在 JSON 中获得 400 状态的 web 服务时返回 false
【发布时间】:2015-07-15 07:52:39
【问题描述】:

在我的代码隐藏文件中,我调用了这个函数:

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 

【问题讨论】:

  • HttpWebResponse 有一个名为 statusCode 的属性
  • @csharpwinphonexaml 我将代码返回到我的 JSON 中。但我还有一个问题。我现在在我的登录功能上使用 Task.Factory。但它停止在 httpWebRequest.BeginGetResponse(callback, httpWebRequest);你知道我该如何解决这个问题吗?
  • 为什么不使用 Windows.Web.Http.HttpClient?

标签: c# json windows-phone windows-phone-8.1


【解决方案1】:

以下代码使用API​​Windows.Web.Http.HttpClient(微软推荐使用此API连接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;
}

在你的代码后面:

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
}

【讨论】:

  • 网址返回给我一个 JSON。那么这行得通吗?
  • 当然,这行读取响应内容:"data.Data = await result.Content.ReadAsStringAsync()"
  • 当我尝试添加类 Result 我显示红线。然后我可以将其解析为 public Windows.Web.Http.HttpStatusCode Status { get;放; }
  • 没错。你可以添加指令 Windows.Web.Http 来阻止这个
【解决方案2】:

由于您收到 Json 响应,因此建议您先将 Newtonsoft nuget 包添加到您的项目中。
现在我们之前使用添加服务引用,但现在我们可以轻松地使用

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;

【讨论】:

    猜你喜欢
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多