在IIS上prod时出现StackoverflowException

时间:2014-04-28 14:33:40

标签: asp.net sql vb.net iis production

我在尝试将我的Web应用程序投入生产时遇到了严重问题。

我的应用程序使用VB.Net(使用Visual Web Developer 2010)进行编码,生产环境是使用Microsoft Server 2008 R2和IIS 7.5的虚拟机,该应用程序使用Asp.net 4.0运行。我也尝试在我自己的计算机(Windows 7)上安装了IIS,并且发生了同样的错误。

为了限制SQL服务器上的费用,我在会话中添加了一个权限列表,每次用户想要访问任何页面时都会加载这些权限。

当此列表包含超过178个对象时,就会发生错误。在178,创建会话并正确执行页面;但是当我添加第179个元素或更多(并且我尝试使用不同的元素,所以这不能来自元素本身),页面只是没有正确执行代码和IIS崩溃......

似乎当此列表中有超过179个元素时,IIS只会回收应用程序,因此会话丢失...

当我使用Visual Web Developer调试应用程序时,它运行良好,没有错误。但是,当我尝试将其投入生产时,就会发生这种错误。所以,这似乎与IIS有关。

另一个问题是当IIS回收我的应用程序时,它不会创建任何日志文件。所以我没有更精确的给你。

我需要帮助才能找到解决此问题的方法。我试了一个星期,我一无所获......这让我发疯了......如果有人有任何想法或需要更多信息,请告诉我,这样我就可以深入挖掘......

感谢大家。

编辑:

我尝试了其他的东西,我绕过了会话,现在,权利直接从SQL收取。问题仍然存在。所以,它不是来自会话,而是来自SQL。 所以,我想知道在对SQL做请求时是否有任何限制。

但是对于返回3000个元素的请求,SQL似乎没有任何问题,当它返回179个带有大量连接的元素时,它就会崩溃......好吧,我不知道该做什么或搜索哪里寻求解决方案......

EDIT2: 但是,就像我说的那样,当我尝试从Visual Web开发人员执行代码时,问题不会发生。而且,使用它或在生产环境中,它是执行de SQL请求的同一个SQL服务器......所以,问题最终不能来自SQL ......

EDIT3: 我终于找到了一些东西在Windows日志中,我有一个StackOverflowException ...有什么好消息! (我们在stackoverflow.com上,是否链接?xD)。

EDIT4: 这是Windows日志中的错误。也许它可以帮助任何人。

Nom du journal :Application
Source :       Windows Error Reporting
Date :         29/04/2014 11:53:11
ID de l’événement :1001
Catégorie de la tâche :Aucun
Niveau :       Information
Mots clés :    Classique
Utilisateur :  N/A
Ordinateur :   SRVWEB.DOMMH01.local
Description :
Récipient d’erreurs , type 0
Nom d’événement : CLR20r3
Réponse : Non disponible
ID de CAB : 0

Signature du problème : 
P1 : w3wp.exe
P2 : 7.5.7601.17514
P3 : 4ce7afa2
P4 : System.Core
P5 : 4.0.30319.18408
P6 : 5231116c
P7 : 1197
P8 : 0
P9 : System.StackOverflowException
P10 : 

Fichiers joints :

Ces fichiers sont peut-être disponibles ici :
C:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_w3wp.exe_e41148f8d4e7fcf353a2d93bfe4367a48b981de2_0a6131b2

Symbole d’analyse : 
Nouvelle recherche de la solution : 0
ID de rapport : 125b520d-cf84-11e3-912f-00155dc81602
Statut du rapport : 4

编辑5: 我把这段代码放在这里,我用LINQ to SQL获取权限。我不认为这会有所帮助,但它就是......

权利包含用户名,权利的ID,家庭的ID(家庭是一组“对象”)和地点。所以,我得到一个与指定用户的权限相关联的“对象/地点”列表......所以我可以限制每个用户只有一些“对象/地点”的访问权限。 另一件事是familyJoker和placeJoker。当权利与placeJoker相关联时,我们将该对象的权利添加到该对象在该族中的任何对象/位置。当家庭成为家庭小丑时,情况也是如此。最后,如果家庭和地方都是小丑,我们添加所有可能的组合(可能的组合在objectPlace表中)

这是代码:

Public Shared Function getListeDroitsUtilisateurSession(ByVal username As String) As List(Of DroitsUtilisateurSession)

    Dim db As SINDIDB = New SINDIDB
    Dim familleJoker As String = FamilleMetier.famille_Joker
    Dim lieuJoker As String = Lieu.lieu_Joker
    Dim requeteSansJoker = From d In db.DroitsUtilisateurs
                                Where d.Utilisateur = username
                            Join r In db.Roles
                                On d.ID_Role Equals r.ID_Role
                            Join oif In db.ObjetsInFamilleMetiers
                                On d.ID_Famille Equals oif.ID_Famille
                            Join f In db.FamilleMetiers
                                On oif.ID_Famille Equals f.ID_Famille
                                Where (Not f.Nom_Famille = familleJoker)
                            Join ol In db.ObjetLieux
                                On oif.ID_Objet Equals ol.ID_Objet
                                Where (d.ID_Lieu = ol.ID_Lieu)
                            Join l In db.Lieux
                                On ol.ID_Lieu Equals l.ID_Lieu
                                Where (Not l.Valeur_Lieu = lieuJoker)
                            Select New DroitsUtilisateurSession With {.Role = r, .ObjetLieu = ol}

    Dim requeteFamilleJoker = From d In db.DroitsUtilisateurs
                                    Where d.Utilisateur = username
                                Join r In db.Roles
                                    On d.ID_Role Equals r.ID_Role
                                Join f In db.FamilleMetiers
                                    On d.ID_Famille Equals f.ID_Famille
                                    Where (f.Nom_Famille = familleJoker)
                                From oCross In db.Objets
                                Join ol In db.ObjetLieux
                                    On oCross.ID_Objet Equals ol.ID_Objet
                                    Where (d.ID_Lieu = ol.ID_Lieu)
                                Select New DroitsUtilisateurSession With {.Role = r, .ObjetLieu = ol}

   Dim requeteLieuJoker = From d In db.DroitsUtilisateurs
                                Where d.Utilisateur = username
                            Join r In db.Roles
                                On d.ID_Role Equals r.ID_Role
                            Join l In db.Lieux
                                On d.ID_Lieu Equals l.ID_Lieu
                                Where (l.Valeur_Lieu = lieuJoker)
                            Join oif In db.ObjetsInFamilleMetiers
                                On d.ID_Famille Equals oif.ID_Famille
                            From lCross In db.Lieux
                            Join ol In db.ObjetLieux
                                On oif.ID_Objet Equals ol.ID_Objet
                                Where (lCross.ID_Lieu = ol.ID_Lieu)
                            Select New DroitsUtilisateurSession With {.Role = r, .ObjetLieu = ol}

    Dim requeteFamilleEtLieuJoker = From d In db.DroitsUtilisateurs
                                        Where d.Utilisateur = username
                                    Join r In db.Roles
                                        On d.ID_Role Equals r.ID_Role
                                    Join f In db.FamilleMetiers
                                        On d.ID_Famille Equals f.ID_Famille
                                        Where (f.Nom_Famille = familleJoker)
                                    Join l In db.Lieux
                                        On d.ID_Lieu Equals l.ID_Lieu
                                        Where (l.Valeur_Lieu = lieuJoker)
                                    From olCross In db.ObjetLieux
                                    Select New DroitsUtilisateurSession With {.Role = r, .ObjetLieu = olCross}

    Dim requeteTotale = requeteSansJoker.Union(requeteFamilleJoker).Union(requeteLieuJoker).Union(requeteFamilleEtLieuJoker)

    Dim resultat As List(Of DroitsUtilisateurSession) = requeteTotale.ToList

    Dim listeDroitsUtilisateur As List(Of DroitsUtilisateurSession) = New List(Of DroitsUtilisateurSession)

    If (resultat IsNot Nothing) Then
        For Each item In resultat
            listeDroitsUtilisateur.Add(New DroitsUtilisateurSession With {.Role = item.Role, .ObjetLieu = item.ObjetLieu})
        Next
    End If

    Return listeDroitsUtilisateur
End Function

编辑6:我发现了一些w3wp应用程序的限制大小。这可以与我的问题联系起来...... 链接在这里 : http://support.microsoft.com/kb/932909 我正在挖掘。

编辑7:所以,我对我的代码做了一些改动。现在,当它必须计算权限时,它让另一个线程做到了。该线程具有更大的堆栈大小。所以我认为它可以改变一些东西,但同样的问题也会发生......

我之前没有说过,但我的应用程序中没有递归代码。

以下是我实施的代码:

Dim ThreadD As ThreadDroits = New ThreadDroits
ThreadD.Username = User.Identity.Name

Dim t = New Thread(AddressOf ThreadD.ExecuteDroits, 419430400)
t.Start()
t.Join()

Dim listeDroits As List(Of DroitsUtilisateurSession) = ThreadD.ListeDroits

这是新课程:

Public Class ThreadDroits
    Private m_Username As String
    Public Property Username As String
        Get
            Return m_Username
        End Get
        Set(ByVal value As String)
            m_Username = value
        End Set
    End Property

    Private m_listeDroits As List(Of DroitsUtilisateurSession)
    Public Property ListeDroits As List(Of DroitsUtilisateurSession)
        Get
            Return m_listeDroits
        End Get
        Set(ByVal value As List(Of DroitsUtilisateurSession))
            m_listeDroits = value
        End Set
    End Property

    Public Sub ExecuteDroits()
        ListeDroits = DroitsUtilisateurSession.getListeDroitsUtilisateurSession(Username)
    End Sub
End Class

0 个答案:

没有答案