C#使用带有多个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

因此,我有两个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 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次