2015-01-19 1 views
0

C# 또는 VB.Net에서 해결책을 찾고 있습니다.웹 응답 상태 코드를 적절하게 얻으십시오.

WebClient을 사용하여 UploadValuesAsync 메서드의 서버 응답을 비동기 적으로 검색하고 싶습니다. 그러나이를 수행하는 방법을 이해할 수 없습니다.

아래 코드의 문제가 노출 같은 문제가 : Get Web Response Status Code properly

예제 코드 :

는 기본적으로 나는이 질문에서 수행 동일한 작업을 수행 (asynchronouslly하지만) 정수로 응답 코드를 얻으려면 연결된 다른 질문에서 e.result 속성이 ok가 아니면 코드보다 다른 상태 코드를 구문 분석 할 수 없다는 예외가 throw됩니다.

e.Error 예외에 대해 Response 속성을 검색했지만 아무 것도 찾지 못해 계속할 수 없습니다. 그런 다음

AddHandler wc.UploadValuesCompleted, AddressOf WC_UploadValuesCompleted 
wc.UploadValuesAsync(New Uri("https://api.imgur.com/3/upload.xml"), values) 

:

Private Sub WC_UploadValuesCompleted(ByVal sender As Object, ByVal e As UploadValuesCompletedEventArgs) 

    If Not e.Cancelled Then 

     Dim responseAsync As Byte() = e.Result 

     ' Read the response (Converting Byte-Array to Stream). 
     Using sr As New StreamReader(New MemoryStream(responseAsync)) 

      Dim serverResponse As String = sr.ReadToEnd 
      Dim xdoc As New XDocument(XDocument.Parse(serverResponse)) 
      Dim status As ImgurStatus = Nothing 

      status = Me.GetResultFromStatus(Convert.ToInt32(xdoc.Root.LastAttribute.Value.ToString)) 

      Select Case status 

       Case ImgurStatus.Success ' 200 
        Return New ImgurImage(New Uri(xdoc.Descendants("link").Value)) 

       Case ImgurStatus.AccessForbidden ' 403 
        RaiseEvent OnAccessForbidden(Me, ImgurStatus.AccessForbidden) 

       Case ImgurStatus.AuthorizationFailed ' 401 
        RaiseEvent OnAuthorizationFailed(Me, ImgurStatus.AuthorizationFailed) 

       Case ImgurStatus.BadImageFormat ' 400 
        RaiseEvent OnBadImageFormat(Me, ImgurStatus.BadImageFormat) 

       Case ImgurStatus.InternalServerError ' 500 
        RaiseEvent OnInternalServerError(Me, ImgurStatus.InternalServerError) 

       Case ImgurStatus.PageIsNotFound ' 404 
        RaiseEvent OnPageIsNotFound(Me, ImgurStatus.PageIsNotFound) 

       Case ImgurStatus.UploadRateLimitError ' 429 
        RaiseEvent OnUploadRateLimitError(Me, ImgurStatus.UploadRateLimitError) 

       Case ImgurStatus.UnknownError ' -0 
        RaiseEvent OnUnknownError(Me, ImgurStatus.UnknownError) 
        Return Nothing 

      End Select 

     End Using '/ sr As New StreamReader 

    End If 

End Sub 
+1

'클래스는 아주 좋은 방법이 할있다 HttpClient' 비동기 적으로. – EZI

+0

의견을 보내 주셔서 감사합니다.하지만 어떻게 해야할지 모르겠습니다. – ElektroStudios

+0

시도하지 않고 예외 결과를 이벤트 arg로 전달하십시오. 그 자리에서 파싱하고 결과 * 값 *으로 변환합니다. (원래의)'RequestToken' 메쏘드는 이미 그 일을하는 코드를 가지고 있습니다. – Plutonix

답변

1

코드 아래는 (Json.Net 사용) 나를 위해 일한 :

async private void button1_Click(object sender, EventArgs e) 
{ 
    var response = await UploadToImgUrl(filename, client_id); 
} 

async Task<ImgUrl.Response> UploadToImgUrl(string fname, string client_id) 
{ 
    string endPoint = "https://api.imgur.com/3/upload"; 
    var data = Convert.ToBase64String(File.ReadAllBytes(fname)); 

    using (var client = new HttpClient()) 
    { 
     client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Client-ID " + client_id);  
     var resp = await client.PostAsJsonAsync(endPoint, new { image = data, type= "base64", name = new FileInfo(fname).Name }); 
     var content = await resp.Content.ReadAsStringAsync(); 
     return JsonConvert.DeserializeObject<ImgUrl.Response>(content); 
    } 
} 

public class ImgUrl 
{ 
    public class Data 
    { 
     public string Id { get; set; } 
     public string Title { get; set; } 
     public string Description { get; set; } 
     public int Datetime { get; set; } 
     public string Type { get; set; } 
     public bool Animated { get; set; } 
     public int Width { get; set; } 
     public int Height { get; set; } 
     public int Size { get; set; } 
     public int Views { get; set; } 
     public int Bandwidth { get; set; } 
     public string Deletehash { get; set; } 
     public string Name { get; set; } 
     public string Link { get; set; } 
    } 

    public class Response 
    { 
     public Data Data { get; set; } 
     public bool Success { get; set; } 
     public int Status { get; set; } 
    } 
}