簡體   English   中英

如何將 HttpWebRequest 更改為 Httpclient

[英]How to change HttpWebRequest to Httpclient

我在將示例中的代碼片段轉換為 http 客戶端時遇到問題。 每次代碼在時間戳計算中中斷。 你能幫我嗎? 我想做的是使用當前技術編寫相同的請求。 例如 httpclient 示例代碼

    public byte[] GetTimeStamp(TimeStampModel model)
    {
        TimeStampRequestGenerator tsrq = new TimeStampRequestGenerator();
        tsrq.SetCertReq(model.certReq);
        BigInteger nonce = BigInteger.ValueOf(DateTime.Now.Ticks);
        TimeStampRequest tsr = tsrq.Generate(model.digestMethod.Oid, model.hash, nonce);
        byte[] data = tsr.GetEncoded();


        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(_url);
        req.Method = "POST";
        req.ContentType = "application/timestamp-query";
        req.ContentLength = data.Length;

        if (!string.IsNullOrEmpty(_user) && !string.IsNullOrEmpty(_password))
        {
            string auth = string.Format("{0}:{1}", _user, _password);
            req.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(auth), Base64FormattingOptions.None);
        }

        Stream reqStream = req.GetRequestStream();
        reqStream.Write(data, 0, data.Length);
        reqStream.Close();

        HttpWebResponse res = (HttpWebResponse)req.GetResponse();
        if (res.StatusCode != HttpStatusCode.OK)
        {
            throw new Exception("Sunucu geçersiz bir yanıt döndürdü");
        }
        else
        {
            Stream resStream = new BufferedStream(res.GetResponseStream());
            TimeStampResponse tsRes = new TimeStampResponse(resStream);
            resStream.Close();

            tsRes.Validate(tsr);
            if (tsRes.TimeStampToken == null)
            {
                throw new Exception("Sunucu herhangi bir zaman damgası döndürmedi");
            }

            return tsRes.TimeStampToken.GetEncoded();
        }
    }

我有一個通用的 httpclientwrapper class。希望它有幫助

public async Task<TResponse> Post<TRequest, TResponse>(TRequest request, string urlToSend, string token)
    {
        try
        {


            using (HttpClient httpClient = new HttpClient())
            {
                httpClient.BaseAddress = new Uri(_url);
                httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(JwtBearerDefaults.AuthenticationScheme, token ?? "");
                var serialized = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
                var httpResponseMessage = await httpClient.PostAsync(urlToSend, serialized);
                //httpResponseMessage.EnsureSuccessStatusCode();
                if (httpResponseMessage.IsSuccessStatusCode)
                {
                    var resStr = httpResponseMessage.Content.ReadAsStringAsync().Result;
                    var responseString = JsonConvert.DeserializeObject<TResponse>(httpResponseMessage.Content.ReadAsStringAsync().Result);

                    return responseString;
                }
                else if (httpResponseMessage.StatusCode == System.Net.HttpStatusCode.BadRequest)
                {
                    var errorRes = httpResponseMessage.Content.ReadAsStringAsync().Result;
                    throw new Exception(errorRes);
                }
                throw new Exception(httpResponseMessage.ReasonPhrase);
            }
        }
        catch (Exception e)
        {

            throw new Exception(e.Message);
        }
    }

在這段代碼中,

- 我從構造函數那里得到了令牌。 不要與它混淆。

  • 我使用異步任務。
  • TRequest 用於發出通用的任何請求 class object。
  • TResponse 是從 remoteurl 得到響應的 class。 您可以使用任何 class。
  • 我想你不必序列化 object,你也必須設置內容類型。

暫無
暫無

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

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