C#HttpClient通用SendAysnc不工作
我不熟悉在C#中编写泛型方法,我正在尝试在我的C#项目中创建一个泛型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
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