2013-04-02 39 views
1

我需要發送一段文本到HTTP服務器。我需要知道已經成功發送的確切數量,而不是發送到強制門戶網站等。但由於HTTP服務器的一些限制,我確定的最好辦法是確保返回的HTTP狀態代碼爲200.如何獲取WinPhone WebClient返回的HTTP狀態碼?

如何獲取從服務器返回的HTTP狀態代碼?

這是我當前的代碼:

 WebClient client = new WebClient(); 
     client.Headers["Content-Type"] = "text/xml"; 
     client.Encoding = Encoding.UTF8; 
     bool? result=null; 
     try 
     { 
      client.UploadStringAsync(server, "POST", data); 
      client.UploadStringCompleted += (s, e) => 
       { 
        result=e.Error == null; 
       }; 
     } 
     catch { } 

目前當服務器返回一個400-500錯誤代碼e.Error將被設置,但如果服務器返回300系列的HTTP狀態代碼。

+0

問:請問您的服務器返回正確的HTTP代碼? e.Result包含實際響應 – AFD

+0

@ADNow e.Result目前將爲空*如果*成功。 200狀態碼的唯一標誌。我們正在嘗試檢測,但是如果手機位於強制門戶內部,但會重定向所有流量 – Earlz

+0

我認爲WebClient已經過簡化。你可以深入下潛嗎?如果你使用HttpWebRequest,你可以得到狀態代碼var Response = we.Response作爲HttpWebResponse; var code = response.StatusCode; – AFD

回答

1

我沒有機會測試此代碼,但是,它可能給你一個想法或兩個:

string data; 

     var request = HttpWebRequest.Create("http://yourserver") as HttpWebRequest; 
     request.Accept = "text/xml"; 
     request.Headers.Add("Accept-Charset", "utf-8"); 

     try 
     { 
      var response = await Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null); 

      // do something with your data, e.g. read it, deserialize it 
      using (var responseStream = response.GetResponseStream()) 
      { 
       using (var reader = new StreamReader(responseStream)) 
       { 
        data = reader.ReadToEnd(); 
       } 
       // .... 
      } 

      var somethingInteresting = response as HttpWebResponse; 
      Debug.WriteLine("Status is {0}", somethingInteresting.StatusCode); 
     } 
     catch (WebException ex) 
     { 
      var errorResponse = ex.Response as HttpWebResponse; 
      var errorHttpStatusCode = errorResponse.StatusCode; 

      Debug.WriteLine("Here's your error Http status: {0}", ex.Status); 
     } 
+0

呵呵,最有趣的是,Windows Phone實際上違反了HTTP規範的一部分,並且帶有這種WebClient行爲。「如果接收到302狀態碼以響應除GET或HEAD以外的請求,則用戶代理必須自動重定向請求,除非用戶可以確認,因爲這可能會改變發出請求的條件。「 – Earlz