asp/asp.net下运行exe文件出现的一个奇怪问题
最近一个项目中,需要在asp/asp.net调用外部exe文件,代码测试无误后,部署到server(window server 2003)上,发现速度非常慢,执行时间一般14秒左右,同样的程序在beta环境(window server 2003)和本机(windows xp professional)上执行很快 速度是300毫秒以内,我感觉非常奇怪,尝试了很多设置,问题还是不能解决,
我想应该不是权限的问题,如果是权限问题,结果应该是要么能够执行要么不能,现在的结果能执行,但是就是非常慢。
请csdn的朋友给些建议或思路 非常感谢!
在asp/asp.net情况都是如此,下面我把code,展示给大家,请予以诊断分析!
asp.net
========================================================================================================================================
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnCheckAndGetTag_Click(object sender, EventArgs e)
{
if ((txtRevisionId.Text.Trim().Length <= 0) ||
(txtSourceCode.Text.Trim().Length <= 0))
{
return;
}
string strResult = string.Empty;
string currenttag = GetTagByReversionIdFromSvnServer(txtSourceCode.Text.Trim(), txtRevisionId.Text.Trim());
if (!string.IsNullOrEmpty(currenttag))
{
strResult = "Current Tag=" + currenttag + "<Br/>";
bool bCheck = CheckDeliveryTagByProjectIDAndTag(currenttag.Replace("\'", ""), txtSourceCode.Text.Trim(), txtRevisionId.Text.Trim());
if (bCheck)
{
strResult += "根据Revision id获取的tag在project delivery中已经存在<Br/>";
}
else
{
strResult += "根据Revision id获取的tag在project delivery中不存在<Br/>";
}
}
else
{
strResult += "根据Revision id没有获取相应的tag<Br/>";
}
lblMessage.Text = strResult;
}
/// <summary>
///
/// </summary>
/// <param name="ReversionId"></param>
/// <returns></returns>
protected string GetTagByReversionIdFromSvnServer(string SourceCodePath, string ReversionId)
{
DateTime dt1 = DateTime.Now;
StringBuilder sbCommand = new StringBuilder();
sbCommand.Append(@"cd /d " + SvnExePath + System.Environment.NewLine);
sbCommand.Append(@"svn.exe log " + SourceCodePath + " -r" + ReversionId + " --xml --username " + SvnExeUser + " --password " + SvnExeUserPassword +
"|find \"msg\"" + System.Environment.NewLine);
sbCommand.Append(@"exit" + System.Environment.NewLine);
string result = RunSvnCommandRight(sbCommand.ToString().Trim()); // 调用的函数在下面
DateTime dt2 = DateTime.Now;
TimeSpan ts = dt2 - dt1;
string executeTime = string.Format("{0}时{1}分{2}秒{3}毫秒", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
Response.Write("Execute svn.exe command time=" + executeTime);
DateTime dt3 = DateTime.Now;
string[] folders = Regex.Split(result, @"\r\n");
StringBuilder sbResult = new StringBuilder();
string strResult = string.Empty;
if (folders != null && folders.Length > 0)
{
for (int i = 0; i < folders.Length; i++)
{
if ((folders[i].IndexOf("<msg>") >= 0) ||
(folders[i].IndexOf("</msg>") >= 0))
{
sbResult.Append(folders[i]);
}
}
}
string strReturn = string.Empty;
strResult = sbResult.ToString();
if (!string.IsNullOrEmpty(strResult))
{
strReturn=strResult.Substring(0, strResult.Length - 6).Substring(5);
}
DateTime dt4 = DateTime.Now;
TimeSpan ts1 = dt4 - dt3;
string executeTime2 = string.Format("{0}时{1}分{2}秒{3}毫秒", ts1.Hours, ts1.Minutes, ts1.Seconds, ts1.Milliseconds);
Response.Write("<br/>");
Response.Write("String process and return value time=" + executeTime2);
return strReturn;
}
/// <summary>
/// 运行脚本命令
/// </summary>
/// <param name="strCommand"></param>
/// <returns></returns>
protected string RunSvnCommandRight(string strCommand)
{
if (string.IsNullOrEmpty(strCommand))
{
return string.Empty;
}
StreamWriter sIn = null;
StreamReader sOut = null;
ProcessStartInfo psi = new ProcessStartInfo("cmd.exe");
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardInput = true;
psi.RedirectStandardError = true;
psi.CreateNoWindow = true;
try
{
Process process = Process.Start(psi);
sOut = process.StandardOutput;
sIn = process.StandardInput;
sIn.WriteLine(strCommand);
process.Close();
return sOut.ReadToEnd();
}
catch (Exception e)
{
return string.Empty;
}
finally
{
if (sIn != null)
{
sIn.Close();
}
if (sOut != null)
{
sOut.Close();
}
}
return string.Empty;
}
asp
==============================================================================================================
<%
Response.Clear()
'初始化执行svn.exe命令的几个参数
dim svnExePath,SvnExeUser,SvnExeUserPassword
svnExePath="C:\Program Files\CollabNet Subversion Client"
SvnExeUser="batuser"
SvnExeUserPassword="cqf3Qfyw5J"
%>
<html>
<head>
<title>根据Revision ID和code path 获取tag</title>
</head>
<body>
<%
if(trim(request.form("btnSubmit"))="提交") then
dim strCodePath,strRevisionId
strCodePath=trim(Request.Form("txtCodePath"))
strRevisionId=trim(Request.Form("txtRevisionId"))
'检测输入
if(len(strCodePath)<=0) then
Response.Write("请输入Source code path!")
Response.End()
end if
if(len(strRevisionId)<=0) then
Response.Write("请输入Revision Id!")
Response.End()
end if
strTag=GetTagByReversionIdFromSvnServer(strCodePath,strRevisionId)
Response.write("Current tag=" & strTag & "<br/>")
end if
%>
<form id="form1" name="form1" action="checktag_dmss.asp" method="post">
<table id="table1" cellspacing="1" cellpadding="1" border="1" style="width:98%">
<tr>
<td style="width:20%;text-align:center">Revision ID:</td>
<td style="width:80%;text-align:left"><input type="text" id="txtRevisionId" name="txtRevisionId" size="60" maxlength="100"/></td>
</tr>
<tr>
<td style="width:20%;text-align:center">Source code path:</td>
<td style="width:80%;text-align:left"><input type="text" id="txtCodePath" name="txtCodePath" size="60" maxlength="100"/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" id="btnSubmit" name="btnSubmit" value="提交" style="width:90px;height:25px">
<input type="reset" id="btnReset" name="btnReset" value="重置" style="width:90px;height:25px">
</td>
</tr>
</table>
</form>
</body>
</html>
<%
Function GetTagByReversionIdFromSvnServer(SourceCodePath,ReversionId)
'检测参数
if ((isnull(SourceCodePath)=true) or (len(SourceCodePath)=0) or (isnull(ReversionId)=true) or (len(ReversionId)=0)) then
GetTagByReversionIdFromSvnServer=""
Exit Function
End if
'需要执行命令行
strCommand="svn.exe log "&SourceCodePath&" -r"&ReversionId&" --xml --username "&SvnExeUser&" --password "&SvnExeUserPassword&"|find" & space(1) & chr(34) & "msg" & chr(34)
'统计开始与结束时间 统计执行花费时间
dim startDateTime,endDateTime,diffDateTime
startDateTime=now()
strResult = RunSvnExeCommand(strCommand)
endDateTime=now()
diffDateTime = DateDiff("s",startDateTime,endDateTime)
Response.Write("执行svn.exe命令花费时:" & Int(diffDateTime/3600) & "小时" & Int(diffDateTime/60) Mod 60 & "分钟" & diffDateTime Mod 60 & "秒<br/>")
if ((IsNull(strResult)=true) or (len(strResult)<=0)) then
GetTagByReversionIdFromSvnServer=""
Exit Function
end if
dim arrResult,strResults,strReturn
strResults=""
arrResult=split(strResult,"<br>")
for i=Lbound(arrResult) to UBound(arrResult)
if((Instr(arrResult(i),"<msg>")>0) or (Instr(arrResult(i),"</msg>")>0)) then
strResults=strResults+arrResult(i)
end if
next
if((IsNull(strResults)=false) and (len(strResults))>0) then
strReturn=Mid(strResults,6,len(strResults)-6)
end if
GetTagByReversionIdFromSvnServer=strReturn
End Function
'执行svn.exe命令的函数
Function RunSvnExeCommand(strComm)
'检测参数
if ((isnull(strComm)=true) or (len(strComm)=0)) then
RunSvnExeCommand=""
Exit Function
End if
Set objWShell = CreateObject("WScript.Shell")
Set objCmd = objWShell.Exec("cmd.exe")
objCmd.StdIn.WriteLine "cd /d " & svnExePath
objCmd.StdIn.WriteLine strComm
objCmd.StdIn.WriteLine "exit"
strPResult = objCmd.StdOut.Readall()
set objCmd = nothing
Set objWShell = nothing
RunSvnExeCommand=replace(strPResult,vbCrLf,"<br>")
End Function
%>
--------------------编程问答-------------------- 纯粹帮顶~~~~~~ --------------------编程问答-------------------- 我也遇到类似问题,不知何解,帮顶!!! --------------------编程问答--------------------
偶想知道调用EXE的代码是哪句 --------------------编程问答-------------------- Process process = Process.Start(psi);
sOut = process.StandardOutput;
sIn = process.StandardInput;
sIn.WriteLine(strCommand);
process.Close();
return sOut.ReadToEnd(); --------------------编程问答-------------------- 哇塞,好长,眼睛看花了,算了,我还没那么厉害,路过,学习。。。。。。 --------------------编程问答-------------------- 继续等待 有见地的回复 谢谢! --------------------编程问答-------------------- 没碰到过,是不是svn在正式环境里面本身就有问题的关系? --------------------编程问答-------------------- 你在txtCodePath中输入的地址是什么,是远程的吗?
直接在你的服务器上运行这个命令看看是不是本来就很慢呢?
svn.exe log xx -rxx --xml --username xx --password xx|find "msg" --------------------编程问答--------------------
我在服务端试过很多次 svn.exe log xx -rxx --xml --username xx --password xx|find "msg" 速度非常快! --------------------编程问答-------------------- svn的日志应该都蛮大的,你查出来有多少条记录,是不是传输的msg太多了? --------------------编程问答-------------------- 把配置删了分别重新部署到两台机器试试 --------------------编程问答-------------------- 我知道的svn log 针对某个项目而言 如果多次delivery话的,tal/label是非常多的,但是查询时如果指定了revision id还是非常快的。 它跟Sql 查询很相似。比如 select * from user 是很浪费时间的,但是 select * from user where userid='001' 还是非常快的! --------------------编程问答-------------------- 我知道的svn log 针对某个项目而言 如果多次delivery话的,tal/label是非常多的,但是查询时如果指定了revision id还是非常快的。 它跟Sql 查询很相似。比如 select * from user 是很浪费时间的,但是 select * from user where userid='001' 还是非常快的! --------------------编程问答-------------------- 这个真是疑难杂症,帮你网上找条几条信息参考下:
1.http://serverfault.com/questions/26217/win7-command-processor-cmd-exe-really-slow
这个人也发现用cmd.exe比较慢,他怀疑是cmd.exe开得太多就会比较慢,这个也没有解决方法,不过你可以换成command.com试下
2.http://www.derkeiler.com/Newsgroups/microsoft.public.security.virus/2004-11/0015.html
这个人说可能是cmd.exe文件被损坏了,你杀下病毒试试? --------------------编程问答-------------------- 这个人做的是和你同样的事情,最后他用了一个第三方组件代替执行cmd解决问题
http://www.svnforum.org/2017/viewtopic.php?t=8314 --------------------编程问答-------------------- Process p = Process.Start(sbCmd.ToString());
p.WaitForExit();
试试 --------------------编程问答-------------------- 用线程 --------------------编程问答-------------------- 谢谢各位朋友的热心回帖!特别是 jshi123
问题已解决,但是具体原因 我还有进一步的研究。
说便说一下解决步骤,希望对各位有所帮助!
我在Server(Window server 2003)上又重新建立了一个应用程序池(portal_appoll),然后把这个asp.net站点(portal)放到了这个应用程序池(portal_appoll)中 ,然后就好了,执行时间明显缩短。
但是具体原因是什么?我还要继续跟进。
以下是我的猜测:
1:在iis6.0 应用程序进程池资源回收机制问题,执行cmd.exe需要很多系统资源,而此时进程池中没有足够资源所以只能等待。
2:执行权限问题,在本机开发调试时,exe 运行的账户是当前的登录用户,但是部署后,执行cmd.exe时运行的账户是network service。
--------------------编程问答-------------------- 代码太长了 你试试调试一下 看看在那一块很浪费时间 --------------------编程问答-------------------- 祝贺 --------------------编程问答-------------------- up
补充:.NET技术 , ASP.NET