微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

HttpClient SendAsync错误-ResponseStatusCode不表示成功

如何解决HttpClient SendAsync错误-ResponseStatusCode不表示成功

我不熟悉使用C#编写通用方法,并且试图在我的c#项目中创建通用SendAsync方法代码如下。

HttpClientHelper.cs

public static async Task<TOut> ExecuteRequest<TIn,TOut>(TIn request,string url)
{
    Uri requestUri = new Uri(url);
    string payload = JsonConvert.SerializeObject(request);
    HttpContent httpContent = new StringContent(payload,Encoding.UTF8,"application/json");

    HttpRequestMessage requestMessage = new HttpRequestMessage
    {
        Method = HttpMethod.Post,RequestUri = requestUri,Content = httpContent
    };

    return await SendUriAsync<TOut>(requestMessage);
}

public static async Task<T> SendUriAsync<T>(HttpRequestMessage requestMessage)
{
    CancellationTokenSource source = new CancellationSource();
    CancellationToken token = source.Token;
    string client_id = "1234";
    
    using (var client = new HttpClient())
    {
        var clientCred = Encoding.UTF8.GetBytes($"{client_id}");
        client.DefaultRequestHeaders.Add("Authorization","Basic "+Convert.ToBase64String(clientCred));
        using(var result = await client.SendAsync(requestMessage,token))
        {
            result.EnsureSuccessstatusCode();
            var response = await result.Content.ReadAsstringAsync();
            
            if(result.IsSuccessstatusCode && response != null)
            {
                return JsonConvert.DeserializeObject<T>(response);
            }
            else
            {
                throw new ApiException{ status = (int)result.StatusCode};
            }
        }        
    }
}

这是调用这些方法的控制器类:

CarSalesController.cs

string thirdpartyUrl = "someurl";
var responSEObject = await HttpClientHelper.ExecuteRequest<CarObject,string>(requestObject,thirdpartyUrl);

我在HttpClientHelper类中遇到错误错误是:

ResponseStatusCode不指示成功。状态码:401-未经授权

但是当我使用邮递员时,相同的API效果很好。这是cURL

curl --location --request GET'someurl'
--header'client_id:1234'
--header'授权:基本asdf'
--header'Content-Type:application / json'
--data-raw'{ “ data1”:“ somedata1”, “ data2”:“ somedata2” }'

我的代码有什么问题?

解决方法

尝试

request.DefaultRequestHeaders.Authorization = 
    new AuthenticationHeaderValue(
        "Basic",Convert.ToBase64String(
            System.Text.ASCIIEncoding.ASCII.GetBytes(
               $"{client_id}")));
,

您需要使用

client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic",Convert.ToBase64String(byteArray));

代替

client.DefaultRequestHeaders.Add("Authorization","Basic "+Convert.ToBase64String(clientCred));

例如:

static async void HTTP_GET()
        {
            var TARGETURL = "http://en.wikipedia.org/";

            HttpClientHandler handler = new HttpClientHandler()
            {
                Proxy = new WebProxy("http://127.0.0.1:8888"),UseProxy = true,};

            Console.WriteLine("GET: + " + TARGETURL);

            // ... Use HttpClient.            
            HttpClient client = new HttpClient(handler);

            var byteArray = Encoding.ASCII.GetBytes("username:password1234");
            client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic",Convert.ToBase64String(byteArray));

            HttpResponseMessage response = await client.GetAsync(TARGETURL);
            HttpContent content = response.Content;

            // ... Check Status Code                                
            Console.WriteLine("Response StatusCode: " + (int)response.StatusCode);

            // ... Read the string.
            string result = await content.ReadAsStringAsync();

            // ... Display the result.
            if (result != null &&
            result.Length >= 50)
            {
                Console.WriteLine(result.Substring(0,50) + "...");
            }
        }
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。