ASP.NET 2.0(VB)からEXCELオブジェクトを起動・操作し、クライアントにDLさせる仕組みを実装しようとしています。
DCOMコンポーネントにASP.NETユーザーを権限追加し、以下のコードでDLさせることはできたのですが、イベント発行からDLボックスが表示されるまでのレスポンスが60秒掛かってしまっています。
サーバーのタスクを監視してると
(1)でEXCELプロセス起動までは、1~2秒後
(2)でファイル作成されるのが、60~70秒後
DCOMによるオートメーションではこんなに時間掛かるものなのでしょうか?
デバッグ環境(XP)では、数秒で動作できているので
オートメーション、もしくはActiveDirectoryに因果しているのかと思っています。
レスポンスを早くするなにか解決策などありましたらご教授願います。
また、以下のコードではリソースが解放されずにリークが発生してしまっています。
こちらもなにか解決案ありましたらよろしくお願いします。
[サーバー環境]
OS:Server 2003、IIS:6.0、Excel 2002
Protected Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button.Click
Dim objExApp As Excel.Application
objExApp=Server.CreateObject("Excel.Application") '<----(1)
objExApp.Application.DisplayAlerts=False
Dim objExBooks As Excel.Workbooks
objExBooks=objExApp.Workbooks
Dim objExBook As Excel.Workbook
objExBook=objExBooks.Add
Dim objExSheets As Excel.Sheets
objExSheets=objExBook.Sheets
Dim objExSheet As Excel.Worksheet
objExSheet=objExSheets(1)
Dim objExCell As Excel.Range
objExCell=objExSheet.Cells
objExCell(1, 1)="EXCEL操作"
objExBook.SaveAs(Server.MapPath("ファイル名")) '<----(2)
If Not objExCell Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExCell)
objExCell=Nothing
End If
If Not objExSheet Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExSheet)
objExSheet=Nothing
End If
If Not objExSheets Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExSheets)
objExSheets=Nothing
End If
If Not objExBook Is Nothing Then
objExBook.Close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExBook)
objExBook=Nothing
End If
If Not objExBooks Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExBooks)
objExBooks=Nothing
End If
If Not objExApp Is Nothing Then
objExApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExApp)
objExApp=Nothing
End If
GC.Collect()
System.Windows.Forms.Application.DoEvents()
Response.Redirect("ページ名")
End Sub
お礼
ありがとうございます。 確かにReleaseComObjectでは1つ参照をデクリメントするだけですね。 RCWのことを考えながらコードを見直したところ、Rangeオブジェクトの参照のところで解放漏れしていたみたいです。 使い終わるごとにReleaseComObject。 Finallyで FinalReleaseComObject とすることでリークを修正することができました。 大変参考になりました。ありがとうございました。 サーバーレスポンスが悪かった件は、 IIS側の匿名アクセスにてAdministratorsグループのユーザーを割り当てることで解決しました。 原因は不明ですが、IUSR_xxx(Guestグループ)では時間が掛かっていたみたいです。