我在尝试将我的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