C#HttpClient通用SendAysnc不工作

C#HttpClient通用SendAysnc不工作,c#,generics,async-await,dotnet-httpclient,sendasync,C#,Generics,Async Await,Dotnet Httpclient,Sendasync,我不熟悉在C#中编写泛型方法,我正在尝试在我的C#项目中创建一个泛型SendAsync方法。代码如下所示 HttpClientHelper.cs string thirdpartyUrl = "someurl"; var responseObject = await HttpClientHelper.ExecuteRequest<CarObject, string>(requestObject, thirdpartyUrl); 公共静态异步任务ExecuteRe

我不熟悉在C#中编写泛型方法,我正在尝试在我的C#项目中创建一个泛型
SendAsync
方法。代码如下所示

HttpClientHelper.cs

string thirdpartyUrl = "someurl";
var responseObject = await HttpClientHelper.ExecuteRequest<CarObject, string>(requestObject, thirdpartyUrl);
公共静态异步任务ExecuteRequest(T2请求,字符串url)
{
urirequesturi=新的Uri(url);
字符串负载=JsonConvert.SerializeObject(请求);
HttpContent HttpContent=新的StringContent(有效负载,“应用程序/json”);
HttpRequestMessage requestMessage=新建HttpRequestMessage
{
方法=HttpMethod.Post,
RequestUri=RequestUri,
Content=httpContent
};
返回等待发送同步(requestMessage);
}
公共静态异步任务SendUriAsync(HttpRequestMessage requestMessage)
{
字符串clint_id=“1234”;
var clineCred=Encoding.UTF8.GetBytes($“{client_id}”);
使用(var result=await client.sendsync(requestMessage))
{
result.EnsureSuccessStatusCode();
var response=wait result.Content.ReadAsStringAsync();
if(result.issusccessstatuscode&&response!=null)
{
返回JsonConvert.DeserializeObject(响应);
}
其他的
{
返回null;
}
}        
}
以下是调用这些方法的控制器类:

carsalecontroller.cs

string thirdpartyUrl = "someurl";
var responseObject = await HttpClientHelper.ExecuteRequest<CarObject, string>(requestObject, thirdpartyUrl);
string thirdpartyUrl=“someurl”;
var responseObject=await HttpClientHelper.ExecuteRequest(请求对象,第三方URL);
我在
HttpClientHelper
类中遇到错误。错误是:

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

但是当我使用postman时,同样的API工作得很好。他是卷发者

curl--位置--请求获取“someurl”
--标题“客户端id:1234”
--标题“授权:基本asdf”
--标题“内容类型:应用程序/json”
--数据原始'{ “data1”:“somedata1”, “data2”:“somedata2” }"


我的代码中可能有什么错误?

问题可能出在
反序列化对象上。尝试使用:

response.Content.ReadAsStringAsync()

问题可能出在
反序列化对象上。尝试使用:

response.Content.ReadAsStringAsync()

这不是你想做的吗

public async Task<TOut> ExecuteRequestAsync<TIn, TOut>( TIn request, string url )
{
    var requestUri = new Uri( url );
    var payload = JsonConvert.SerializeObject( request );
    var httpContent = new StringContent( payload, Encoding.UTF8, "application/json" );
    var requestMessage = new HttpRequestMessage()
    {
        Method = HttpMethod.Post,
        RequestUri = requestUri,
        Content = httpContent
    };
    return await SendUriAsync<TOut>( requestMessage );
}

public static async Task<T> SendUriAsync<T>( HttpRequestMessage requestMessage )
{
    using (var client = CreateClient( 1234 ))
    {
        var result = await client.SendAsync( requestMessage );
        result.EnsureSuccessStatusCode();
        var response = await result.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<T>( response );
    }
}

private static HttpClient CreateClient(int clientId)
{
    var clientCred = Encoding.UTF8.GetBytes( clientId.ToString() );
    var auth = Convert.ToBase64String( clientCred );
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Basic", auth );
    client.DefaultRequestHeaders.Add( "client_id", "1234" );
    return client;
}
公共异步任务ExecuteRequestAsync(TIn请求,字符串url)
{
var requestUri=新Uri(url);
var payload=JsonConvert.SerializeObject(请求);
var httpContent=newstringcontent(有效负载,Encoding.UTF8,“application/json”);
var requestMessage=new-HttpRequestMessage()
{
方法=HttpMethod.Post,
RequestUri=RequestUri,
Content=httpContent
};
返回等待发送同步(requestMessage);
}
公共静态异步任务SendUriAsync(HttpRequestMessage requestMessage)
{
使用(var client=CreateClient(1234))
{
var result=await client.sendsync(requestMessage);
result.EnsureSuccessStatusCode();
var response=wait result.Content.ReadAsStringAsync();
返回JsonConvert.DeserializeObject(响应);
}
}
私有静态HttpClient CreateClient(int-clientId)
{
var clientCred=Encoding.UTF8.GetBytes(clientId.ToString());
var auth=Convert.ToBase64String(clientCred);
var client=新的HttpClient();
client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“基本”,auth);
client.DefaultRequestHeaders.Add(“client_id”,“1234”);
返回客户;
}

这不是你想要做的吗

public async Task<TOut> ExecuteRequestAsync<TIn, TOut>( TIn request, string url )
{
    var requestUri = new Uri( url );
    var payload = JsonConvert.SerializeObject( request );
    var httpContent = new StringContent( payload, Encoding.UTF8, "application/json" );
    var requestMessage = new HttpRequestMessage()
    {
        Method = HttpMethod.Post,
        RequestUri = requestUri,
        Content = httpContent
    };
    return await SendUriAsync<TOut>( requestMessage );
}

public static async Task<T> SendUriAsync<T>( HttpRequestMessage requestMessage )
{
    using (var client = CreateClient( 1234 ))
    {
        var result = await client.SendAsync( requestMessage );
        result.EnsureSuccessStatusCode();
        var response = await result.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<T>( response );
    }
}

private static HttpClient CreateClient(int clientId)
{
    var clientCred = Encoding.UTF8.GetBytes( clientId.ToString() );
    var auth = Convert.ToBase64String( clientCred );
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Basic", auth );
    client.DefaultRequestHeaders.Add( "client_id", "1234" );
    return client;
}
公共异步任务ExecuteRequestAsync(TIn请求,字符串url)
{
var requestUri=新Uri(url);
var payload=JsonConvert.SerializeObject(请求);
var httpContent=newstringcontent(有效负载,Encoding.UTF8,“application/json”);
var requestMessage=new-HttpRequestMessage()
{
方法=HttpMethod.Post,
RequestUri=RequestUri,
Content=httpContent
};
返回等待发送同步(requestMessage);
}
公共静态异步任务SendUriAsync(HttpRequestMessage requestMessage)
{
使用(var client=CreateClient(1234))
{
var result=await client.sendsync(requestMessage);
result.EnsureSuccessStatusCode();
var response=wait result.Content.ReadAsStringAsync();
返回JsonConvert.DeserializeObject(响应);
}
}
私有静态HttpClient CreateClient(int-clientId)
{
var clientCred=Encoding.UTF8.GetBytes(clientId.ToString());
var auth=Convert.ToBase64String(clientCred);
var client=新的HttpClient();
client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“基本”,auth);
client.DefaultRequestHeaders.Add(“client_id”,“1234”);
返回客户;
}

试试:CreateRequest@jdweng此更改无效您不应该序列化(而不是反序列化)CreateRequest方法最后一行中的对象吗?您正在反序列化响应twice@MikaKarjunen谢谢你的提示。我已根据尝试修改了代码:CreateRequest@jdweng此更改无效您不应该序列化(而不是反序列化)CreateRequest方法最后一行中的对象吗?您正在反序列化响应twice@MikaKarjunen谢谢你的提示。我在CreateRequest()方法中修改了相应的代码,当我将其更改为上述代码时,它说“无法将任务转换为TOut”@Learner,您不能从
response
反序列化,您必须从字符串反序列化。在CreateRequest()方法中,当我将其更改为上述代码时,它说“无法将任务转换为TOut”@学习者,您不能从
响应反序列化
您必须从字符串反序列化。谢谢。这很有魅力。我在做不必要的转换。但是,当我执行代码时,它在client.sendaync(requestMessage)行中给出了一个错误,它说“无法从传输连接读取数据。现有的connec