Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 使用负载平衡器时出现文件权限错误_Asp.net_Vb.net_Load Balancing - Fatal编程技术网

Asp.net 使用负载平衡器时出现文件权限错误

Asp.net 使用负载平衡器时出现文件权限错误,asp.net,vb.net,load-balancing,Asp.net,Vb.net,Load Balancing,我的日志记录有问题。我有一个类,用于将ASP.net应用程序中的事件记录到文本文件中。这门课似乎学得很好。但是,由于我们使用的是负载平衡器,因此会出现复杂情况。我们在两台服务器上运行应用程序。如果一台服务器出现故障,负载平衡器将把web应用程序切换到另一台服务器。我还可以指示浏览器指定在哪个服务器上查看应用程序 问题是,当我转到一台服务器时,应用程序可以正常登录。但如果我尝试切换到其他服务器,则会出现以下错误: 异常详细信息:System.UnauthorizedAccess异常:对路径“\my

我的日志记录有问题。我有一个类,用于将ASP.net应用程序中的事件记录到文本文件中。这门课似乎学得很好。但是,由于我们使用的是负载平衡器,因此会出现复杂情况。我们在两台服务器上运行应用程序。如果一台服务器出现故障,负载平衡器将把web应用程序切换到另一台服务器。我还可以指示浏览器指定在哪个服务器上查看应用程序

问题是,当我转到一台服务器时,应用程序可以正常登录。但如果我尝试切换到其他服务器,则会出现以下错误:

异常详细信息:System.UnauthorizedAccess异常:对路径“\myServer qa\plantshare\someFolder\myApp\Logs\2012\u 12\u 14.txt”的访问被拒绝

ASP.NET无权访问请求的资源。考虑 向ASP.NET请求授予对资源的访问权限 身份。ASP.NET具有基本进程标识(通常为 {MACHINE}\ASPNET(在IIS 5上)或IIS 6上的网络服务),如果 应用程序没有模拟。如果申请是 通过模拟,身份将为 匿名用户(通常为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

听起来文件被锁定了(由一个从未释放它的进程打开,然后另一个进程尝试打开该文件)。另一种可能性是,文件在该实例中被锁定,您只需重试几次。我想这可能与锁定有关,这就是为什么我将该类设为singleton并使用SyncLock的原因。这难道不应该阻止它吗?另外,当我得到这个错误时,只有服务器没有创建日志文件。即使我在一台服务器上得到了这个错误,使用另一台服务器上的web应用程序也不会导致这个错误?在每个服务器的
路径中
还是两个应用都写入同一个文件?听起来像是权限问题(app1\user写入,而app2\user无法覆盖,因为app2\user没有任何权限)。是的,它会写入第三台服务器上的同一文件(位于同一位置)。如果是权限错误,您知道如何处理吗?另外,不应该使用IIS帐户创建文件。对于服务器,它们都是相同的。