2013-05-17 40 views
1

我有下面的代码被连接到一个API基本身份验证:如何从一个BackgroundWorker得到HTTP状态代码

var worker = new BackgroundWorker(); 

worker.DoWork += (sender, args) => { 
    var request = HttpWebRequest.Create(url); 
    request.Credentials = new NetworkCredential(email, password); 
    args.Result = request.GetResponse(); 
}; 

worker.RunWorkerCompleted += (sender, e) => { 
    String msg = ""; 
    // need to check whether there has been an error 
    // otherwise trying to get the result throws an exception 
    if (e.Error == null) { 
     var code = ((HttpWebResponse)e.Result).StatusCode; 
     if (code == HttpStatusCode.OK) 
      msg = "Connectivity OK"; 
     else if (code == HttpStatusCode.Unauthorized) 
      msg = "Wrong username"; 
     else if (code == HttpStatusCode.Forbidden) 
      msg = "Wrong password"; 
     else if (code == HttpStatusCode.NotFound) 
      msg = "Wrong organisation"; 
     else 
      msg = "Connectivity Error: " + code; 
    } else { 
     msg = "Connectivity error: " + e.Error.Message; 
    } 
    label.Text = msg; 
    log.d(msg); 
}; 

我想获得的状态代码,以便能够仿佛在告诉用户用户名,密码或组织是错误的。不幸的是,如果出现网络错误,试图获得e.Result会导致另一个错误,所以如果没有错误,我只能检查状态码。我试过使用各种其他所谓的异步C#网络方法,例如, webclient.downloadStringAsync,但它们并不是真正的异步; DNS解析在当前线程上完成。我也不能使用异步并等待,因为我必须使用Net Framework 4.0。

回答

0

就找到了答案,以我自己的问题,在这里:https://stackoverflow.com/a/4700154/519074

在4XX和5XX范围内的服务器响应扔引发WebException,所以你必须以检查。此代码有效:

var worker = new BackgroundWorker(); 

worker.DoWork += (sender, args) => { 
    var request = HttpWebRequest.Create(url); 
    request.Credentials = new NetworkCredential(email, password); 
    // TODO: set proxy settings if necessary 
    try { 
     args.Result = ((HttpWebResponse)request.GetResponse()).StatusCode; 
    } catch (WebException we) { 
     args.Result = ((HttpWebResponse)we.Response).StatusCode; 
    } 
}; 

worker.RunWorkerCompleted += (sender, e) => { 
    String msg = ""; 
    var code = (HttpStatusCode)e.Result; 
    if (code == HttpStatusCode.OK) 
     msg = "Connectivity OK"; 
    else if (code == HttpStatusCode.Forbidden) 
     msg = "Wrong username or password"; 
    else if (code == HttpStatusCode.NotFound) 
     msg = "Wrong organisation"; 
    else 
     msg = "Connectivity Error: " + code; 
    label.Text = msg; 
    log.d(msg); 
};