当前位置:编程学习 > C#/ASP.NET >>

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" --------------------编程问答--------------------
引用 8 楼 jshi123 的回复:
你在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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,