2011-01-14 72 views
1

我更新已存在的老工藝,其工作創建一個COM對象的過程如下:無法從一個asp網站

用戶提交它運行下面的ASP(簡化形式,名稱變更):

<% 
    set rb = Server.CreateObject("RecordBuilder.SomeObject") 
    rb.Calculate() 
    rb.StartProcess() 
    %> 

RecordBuilder.SomeObject是一個老VB6 DLL,我沒有VB6,所以我把它轉化爲VB.NeT 4.0

的調用Calculate()按預期工作,調用StartProcess()失敗。

StartProcess()如下:

Public Function StartProcess() 
    Try 
     strProcess = "Starting process" 
     Dim proc = New Process() 
     proc.StartInfo.RedirectStandardOutput = True 
     proc.StartInfo.UseShellExecute = False 
     proc.StartInfo.CreateNoWindow = True 
     proc.StartInfo.FileName = "d:\App\RecordProcessor.exe" 

     Dim procHandle = proc.Start() 
     strProcess = "Started process" 
    Catch ex As Exception 
     Err.Raise(vbObjectError + 9999, "RecordBuilder.SomeObject", strProcess & " failed: " & ex.Message & "<hr />Stack Trace:<br />" & ex.StackTrace) 
    End Try 
End Function 

這種失敗,調用proc.Start(),但是如果我測試ASP複製到.vbs文件預計它會奏效。

我已更改d:\App\RecordProcessor.exe上的權限以授予對組Everyone的執行權限。

+0

什麼異常,你拋出? – Kev 2011-01-14 16:16:03

+0

得到它的工作。我從Visual Studio中重新生成了我的強名鍵,而不是通過「sn -k」。另外,如果RedirectStandardOutput,UseShellExecute和CreateNoWindow沒有全部設置正確,它會嘗試在窗口中運行應用程序,並且失敗並拒絕訪問。 – user575846 2011-01-14 18:56:24

回答

0

檢查網站的匿名用戶帳戶是否具有d:\app文件夾及其可能接觸的任何其他文件夾的必要權限。

我注意到缺少的一件事是在proc.Start()之後proc.WaitForExit()

你可能想要的,所以你可以捕捉從過程本身以及錯誤:

Dim stdError As New String 
Try 
    strProcess = "Starting process" 
    Dim proc = New Process() 
    proc.StartInfo.RedirectStandardOutput = True 
    proc.StartInfo.RedirectStandardError = True 
    proc.StartInfo.UseShellExecute = False 
    proc.StartInfo.CreateNoWindow = True 
    proc.StartInfo.FileName = "d:\App\RecordProcessor.exe" 

    Dim procHandle = proc.Start() 
    strProcess = "Started process" 

    proc.WaitForExit() 

    stdError = proc.StandardError.ReadToEnd() 
    If stdError.Length > 0 Then 
     '' So long since I did VB so next line might need tweaked 
     Err.Raise(vbObjectError, "Caught StdError", stdError) 
    End If 
Catch ex As Exception 
    Err.Raise(vbObjectError + 9999, "RecordBuilder.SomeObject", strProcess & _ 
     " failed: " & ex.Message & "<hr />Stack Trace:<br />" & ex.StackTrace) 
End Try