2017-08-24 104 views
0

我是REST和VSTO的新手。我做了我的第一个excel插件,它执行web请求并将信息放入excel。用户通过将它们放入Excel中的列来指定他们想要的票。 add-inthen会根据该列中的内容执行webrequest以获取信息。然后它将该信息写入excel。提高多个REST请求的性能

问题是我联系的API只允许您一次发送一张票。问题在于速度缓慢。它冻结约3秒钟,然后每个条目大约需要1.5秒。我逐步完成了我的项目,并且大部分时间都在制作网络请求。任何人都可以提出更好的替代我的代码?

我在哪里做所有的工作。

public partial class RibbonMain 
{ 
    private void RibbonMain_Load(object sender, RibbonUIEventArgs e) 
    { 

    } 

    //Gather Incident list 
    //collect incident information 
    //write the results to excel 
    private void btnGetServiceNowInfo_Click(object sender, RibbonControlEventArgs e) 
    { 
     //Get active worksheet 
     ProgressForm progressForm = new ProgressForm(); 
     progressForm.Show(); 
     Excel.Worksheet activeWorksheet = Globals.ThisAddIn.GetActiveWorksheet(); 
     int intRow = 2; 
     rClient rClient = new rClient(); 
     rClient.httpUsername = Settings.Default["Username"].ToString(); 
     rClient.httpPassword = Settings.Default["Password"].ToString(); 
     string strReponse = string.Empty; 

     //iterate through incident row 
     //adds incident numbers to list 
     while (true) 
     { 
      Range intRange = activeWorksheet.get_Range("D" + intRow); 
      if (intRange.Value == null) 
      { 
       break; 
      } 
      Range numRange = activeWorksheet.get_Range("A" + intRow); 
      Range descRange = activeWorksheet.get_Range("B" + intRow); 
      Range sys_idRange = activeWorksheet.get_Range("C" + intRow); 
      rClient.endPoint = "https://dev32395.service-now.com/api/now/table/incident?sysparm_query=number%3D" + intRange.Value + "&sysparm_fields=number%2Csys_id%2Cdescription&sysparm_limit=1"; 
      strReponse = rClient.makeReqest(); 
      var deserializedResult = JsonConvert.DeserializeObject<JsonResult>(strReponse); 
      var jsonResult = deserializedResult.result.First(); 
      numRange.Value = jsonResult.number; 
      descRange.Value = jsonResult.description; 
      sys_idRange.Value = jsonResult.sys_id; 
      intRow++; 
     } 
     lstIncidentNum.Clear(); 
     progressForm.Hide(); 
    } 

    //call settings form 
    private void btnSettings_Click(object sender, RibbonControlEventArgs e) 
    { 
     SettingForm settingForm = new SettingForm(); 
     settingForm.Show(); 
    } 
} 

此行using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())是它花费2000 MS对于所述第一请求和大约300 MS其他请求。

public enum httpVerb 
    { 
     GET, 
     POST, 
     PUT, 
     DELETE 
    } 

    class rClient 
    { 
     public string endPoint { get; set; } 
     public httpVerb httpMethod { get; set; } 
     public string httpUsername { get; set; } 
     public string httpPassword { get; set; } 

     public rClient() 
     { 
      endPoint = string.Empty; 
      httpMethod = httpVerb.GET; 
      httpUsername = string.Empty; 
      httpPassword = string.Empty; 
     } 

     public string makeReqest() 
     { 
      string strResponseValue = string.Empty; 

      HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(endPoint); 

      webRequest.Method = httpMethod.ToString(); 

      string Credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(httpUsername + ":" + httpPassword)); 

      webRequest.Headers.Add("Authorization", "Basic " + Credentials); 

      using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse()) 
      { 
       if(webResponse.StatusCode != HttpStatusCode.OK) 
       { 
        throw new ApplicationException("Error: " + webResponse.StatusCode.ToString()); 
       } 

       using(Stream responseStream = webResponse.GetResponseStream()) 
       { 
        if (responseStream != null) 
        { 
         using (StreamReader reader = new StreamReader(responseStream)) 
         { 
          strResponseValue = reader.ReadToEnd(); 
         } 
        } 
       } 
      } 
      return strResponseValue; 
     } 

回答

0

您可以尝试使用任务命名空间来生成多个同时调用,但所有可能最终都会超载您的Web服务器。它值得进行实验,看看它的通信滞后是否会导致客户端响应缓慢,或者您的web服务器是否缓慢运行。要做到这一点,你可以安装免费的工具Fiddler来观看从Excel客户端到Web服务器的调用/响应模式 - 它会给你一个想法,在哪里花费时间。如果网络滞后,那么产生多个同时呼叫将有助于缩短总时间。

+0

我会研究它,servicenow是基于云的,所以不知道我是否会超载它们。当然不是。 – ffalor