C#使用带有多个http POST请求的web api
因此,我有两个http Post请求使用web api,如下所示:-C#使用带有多个http POST请求的web api,c#,session,asp.net-web-api,C#,Session,Asp.net Web Api,因此,我有两个http Post请求使用web api,如下所示:- using (var client = new HttpClient()) { client.BaseAddress = new Uri("https://your_url.com:8443/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQual
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://your_url.com:8443/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// 1st request //
var datatobeSent = new ApiSendData()
{
UserID = "xxx",
UserPsw = "yyy",
ApiFunc = "zzz",
clearData = "x1y1z1"
};
HttpResponseMessage response = await client.PostAsJsonAsync("WebApi", datatobeSent);
var resultData = await response.Content.ReadAsStringAsync();
#region Extract Secured Data response from WebApi
JObject JsonObject = JObject.Parse(resultData);
datatobeSent.SecureData = (string)JsonObject["SecureResult"];
#endregion
// 2nd request //
var datatobeSent2 = new ApiSendData()
{
UserID = "xxx",
UserPsw = "yyy",
ApiFunc = "zzz",
SecureData = datatobeSent.SecureData
};
HttpResponseMessage response2 = await client.PostAsJsonAsync("WebApi", datatobeSent2);
var resultData2 = await response2.Content.ReadAsStringAsync();
}
所以现在我需要澄清一下
1) 我的两个http POST请求是否都通过同一个SSL会话发送
2) 如果不是,那么我如何将两者结合起来,并通过单个连接/会话发送这两个请求
3) 如何提高此代码的性能?目前,处理和响应100个请求需要11秒。(我刚才使用了一个for循环,它统计了上述两个示例的100个http post请求)它们通过相同的SSL会话和连接。同一个HttpClient实例共享一些配置和底层TCP连接。因此,您应该重用同一个实例,您已经在使用
语句执行此操作
我将尝试通过异步发出post请求并处理结果来提高代码的性能。这里有一个选项:
创建一个新类来处理这些异步请求
public class WebHelper
{
public async Task<string> MakePostRequest(HttpClient client, string route, object dataToBeSent)
{
try{
HttpResponseMessage response = await client.PostAsJsonAsync(route, datatobeSent);
string resultData = await response.Content.ReadAsStringAsync();
return resultData;
}
catch (Exception ex){
return ex.Message;
}
}
}
公共类WebHelper
{
公共异步任务MakePostRequest(HttpClient客户端、字符串路由、对象dataToBeSent)
{
试一试{
HttpResponseMessage response=等待客户端.postsJSONASync(路由,数据到当前);
string resultData=wait response.Content.ReadAsStringAsync();
返回结果数据;
}
捕获(例外情况除外){
返回ex.消息;
}
}
}
请注意,正在使用相同的httpClient实例。在主代码中,您可以这样测试您的性能(为了简化我们的测试,我只使用相同的参数发出post请求101次):
//开始时间测量
List TaskList=新列表();
对于(int i=0;i<100;i++)
{
Task postTask=Task.Run(异步()=>
{
WebHelper webRequest=新的WebHelper();
string response=wait webRequest.MakePostRequest(客户端,“WebApi”,dataToBeSent);
控制台写入线(响应);
});
任务列表。添加(postTask);
}
Task.WaitAll(TaskList.ToArray());
//结束时间测量
这只是对代码的一个改进:使用try/catch发出请求 它们通过相同的SSL会话和连接。同一个HttpClient实例共享一些配置和底层TCP连接。因此,您应该重用同一个实例,您已经在使用语句执行此操作
我将尝试通过异步发出post请求并处理结果来提高代码的性能。这里有一个选项:
创建一个新类来处理这些异步请求
public class WebHelper
{
public async Task<string> MakePostRequest(HttpClient client, string route, object dataToBeSent)
{
try{
HttpResponseMessage response = await client.PostAsJsonAsync(route, datatobeSent);
string resultData = await response.Content.ReadAsStringAsync();
return resultData;
}
catch (Exception ex){
return ex.Message;
}
}
}
公共类WebHelper
{
公共异步任务MakePostRequest(HttpClient客户端、字符串路由、对象dataToBeSent)
{
试一试{
HttpResponseMessage response=等待客户端.postsJSONASync(路由,数据到当前);
string resultData=wait response.Content.ReadAsStringAsync();
返回结果数据;
}
捕获(例外情况除外){
返回ex.消息;
}
}
}
请注意,正在使用相同的httpClient实例。在主代码中,您可以这样测试您的性能(为了简化我们的测试,我只使用相同的参数发出post请求101次):
//开始时间测量
List TaskList=新列表();
对于(int i=0;i<100;i++)
{
Task postTask=Task.Run(异步()=>
{
WebHelper webRequest=新的WebHelper();
string response=wait webRequest.MakePostRequest(客户端,“WebApi”,dataToBeSent);
控制台写入线(响应);
});
任务列表。添加(postTask);
}
Task.WaitAll(TaskList.ToArray());
//结束时间测量
这只是对代码的一个改进:使用try/catch发出请求 虽然HttpClient的目标是使用相同的Ssl会话和连接,但无法保证这一点,因为这取决于同时维护会话和连接的服务器。如果服务器删除它们,HttpClient将透明地重新协商新的连接和会话
也就是说,虽然连接和ssl会话建立会带来一些开销,但这不太可能是任何性能问题的根本原因
鉴于上述代码的简单性,我强烈怀疑性能问题不在您的客户端代码中,而在您所连接的服务中
要确定这一点,您需要隔离该服务的性能。根据您对该服务的控制级别,有几个选项可供选择:
如果您是该服务的所有者,请使用类似的工具直接针对该服务执行在线性能测试。如果blitz.io的100个连续请求需要11秒,那么您发布的代码不是罪魁祸首,因为服务本身的平均响应时间只有110毫秒
如果您不是该服务的所有者,请使用类似这样的工具创建该服务的在线测试,并使用现有的测试循环。如果使用Mountebank的测试循环执行得很快,那么同样,您发布的代码不是罪魁祸首。(Mountebank支持https,但您需要拥有密钥对,或者使用其自签名证书并在客户端中禁用证书验证。)
值得注意的是,复杂的web服务需要110毫秒的响应时间并不罕见。您的测试似乎是在执行一系列连续的请求—每次一个请求—大多数web服务都是围绕并行处理来自独立用户的多个请求进行优化的。可伸缩性的挑战在于,在确保平均响应时间为110毫秒的情况下,我可以为多少并发用户提供服务。但是,如果一次只有一个用户在使用该服务,仍然需要约110毫秒
因此,您可以采取的一个更早的验证步骤是确定您对循环中100个连续请求的测试是否是您实际性能需求的有效表示,或者您是否应该在pa中调用您的方法100次