0

ロギングに問題があります。ASP.net アプリケーションで、イベントをテキスト ファイルに記録するために使用するクラスがあります。クラスはうまくいっているようです。ただし、ロード バランサーを使用しているため、複雑な問題が発生します。2 つのサーバーでアプリを実行します。1 つのサーバーに障害が発生した場合、ロード バランサーは Web アプリケーションを別のサーバーに切り替えます。アプリケーションを表示するサーバーを指定するようにブラウザーに指示することもできます。

問題は、あるサーバーにアクセスすると、アプリケーションが問題なくログに記録できることです。しかし、他のサーバーに切り替えようとすると、次のエラーが発生します。

例外の詳細: System.UnauthorizedAccessException: パス '\myServer-qa\plantshare\someFolder\myApp\Logs\2012_12_14.txt' へのアクセスが拒否されました。

ASP.NET は、要求されたリソースへのアクセスを許可されていません。リソースへのアクセス権を ASP.NET 要求 ID に付与することを検討してください。ASP.NET には、アプリケーションが偽装していない場合に使用されるベース プロセス ID (通常、IIS 5 では {MACHINE}\ASPNET、IIS 6 ではネットワーク サービス) があります。アプリケーションが を介して偽装している場合、ID は匿名ユーザー (通常は IUSR_MACHINENAME) または認証された要求ユーザーになります。

ファイルへの ASP.NET アクセスを許可するには、エクスプローラーでファイルを右クリックし、[プロパティ] を選択して、[セキュリティ] タブを選択します。[追加] をクリックして、適切なユーザーまたはグループを追加します。ASP.NET アカウントを強調表示し、必要なアクセスのボックスをオンにします。

ファイルを削除すると、最初に作成したサーバーは問題ありませんが、他のサーバーは失敗します。ファイルのアクセス許可を確認すると、それを作成したサーバーのみがアクセス許可を持ちます。これは私のコードまたは IIS の問題ですか? また、Windows認証を使用しています。これが私が書くために使用するクラスです:

Imports System.Net
Imports System.IO

Public Class logger

    Private Shared _thisInstance As logger
    Private Shared InstanceLock As New Object
    Private Shared FileLock As New Object

    Private _path As String
    Public Property path() As String
        Get
            Return _path
        End Get
        Set(ByVal value As String)
            _path = value
        End Set
    End Property

    Protected Sub New(ByVal path As String)
        Me.path = path
    End Sub

    Public Shared Function GetSingleton(ByVal path As String) As logger

        SyncLock InstanceLock
            If _thisInstance Is Nothing Then
                _thisInstance = New logger(path)
            End If
        End SyncLock

        Return _thisInstance
    End Function


    Private Function checkDir(ByVal path As String) As Boolean
        Dim dir As New DirectoryInfo(path)
        Dim exist As Boolean = True
        If Not dir.Exists Then
            Try
                dir.Create()
            Catch ex As Exception
                exist = False
            End Try
        End If
        Return exist
    End Function
    Private Function checkFile(ByVal path As String) As Boolean

        Dim myFile As New FileInfo(path)
        Dim exist As Boolean = True
        Dim objWriter As IO.StreamWriter
        Dim fs As FileStream

        If Not myFile.Exists Then
            Try

                fs = New FileStream(path, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.ReadWrite)
                objWriter = New System.IO.StreamWriter(fs)

                objWriter.Close()
                objWriter.Dispose()
                fs.Close()
                fs.Dispose()

            Catch ex As Exception
                exist = False
            Finally

            End Try
        End If

        Return exist
    End Function

    'updates file
    Public Sub Logger(ByVal filePath As String, ByVal Message As String, ByVal title As String, Optional ByVal stkTrace As String = "")
        Dim sw As StreamWriter
        Dim fs As FileStream
        Dim path As String
        Dim now As DateTime = DateTime.Now
        Dim today As String

        today = Date.Now.ToString("yyy/MM/dd")
        path = Me.path & today.Replace("/", "_") & ".txt"

        If checkFile(path) Then
            SyncLock FileLock
                fs = New FileStream(path, FileMode.Append)
                sw = New StreamWriter(fs)
                Try
                    sw.WriteLine("Title: " & title)
                    sw.WriteLine("Message: " & Message)
                    sw.WriteLine("StackTrace: " & stkTrace)
                    sw.WriteLine("Date/Time: " & now.ToString("yyyy/MM/dd HH:mm:ss"))
                    sw.WriteLine("================================================")
                    sw.Flush()
                Catch ex As Exception
                    Throw
                Finally
                    sw.Close()
                    fs.Close()

                    sw.Dispose()
                    fs.Dispose()
                End Try
            End SyncLock
        End If

    End Sub


End Class
4

0 に答える 0