簡體   English   中英

異步正確獲取Web響應狀態代碼

[英]Get Web Response Status Code properly Asynchronously

我正在C#VB.Net中尋找此問題的解決方案。

我想使用WebClient異步檢索UploadValuesAsync方法的服務器響應,但是我不知道該怎么做。

基本上我想在這個問題上做同樣的事情,獲取響應代碼為Integer(但異步地): 正確獲取Web響應狀態代碼

示例代碼:

以下代碼的問題與我鏈接的另一個問題中暴露的問題相同,如果e.result屬性不e.result ,它將引發異常,則我無法解析除200代碼以外的任何其他狀態代碼,因為該異常。

我已經在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

下面的代碼為我工作(使用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; }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM