我是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;
}
我会研究它,servicenow是基于云的,所以不知道我是否会超载它们。当然不是。 – ffalor