2009-10-16 5 views
3

J'ai un site mobile C# et j'ai un problème avec certains clients mobiles. J'ai posté une trace ci-dessous, mais fondamentalement navigateur de téléphone ou passerelle wap que le téléphone se connecte à l'URL d'Internet encode viewstate entrée cachée dans le formulaire.asp.net Caractère invalide dans une chaîne Base-64

/wEPDwULLTExNTMyOTcwOTBkGAEFBlBtTGlzdA9nZA ==

devient

% 2FwEPDwULLTExNTMyOTcwOTBkGAEFBlBtTGlzdA9nZA% 3D% 3D

si viewstate échoue.

Est-il possible de surcharger et d'urdecoder les informations viewstate avant de procéder?

 
System.Web.HttpException: The state information is invalid for this page and might be corrupted. ---> System.Web.UI.ViewStateException: Invalid viewstate. 
Client IP: 65.91.116.34 
Port: 37172 
User-Agent: SCH-R430 UP.Browser/6.2.3.8 (GUI) MMP/2.0 
ViewState: %2FwEPDwULLTExNTMyOTcwOTBkGAEFBlBtTGlzdA9nZA%3D%3D 
Referer: 
Path: /mobile/Inbox.aspx ---> System.FormatException: Invalid character in a Base-64 string. 
    at System.Convert.FromBase64String(String s) 
    at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) 
    at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState) 
    at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState) 
    at System.Web.UI.HiddenFieldPageStatePersister.Load() 
    --- End of inner exception stack trace --- 
    --- End of inner exception stack trace --- 
    at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) 
    at System.Web.UI.ViewStateException.ThrowViewStateError(Exception inner, String persistedState) 
    at System.Web.UI.HiddenFieldPageStatePersister.Load() 
    at System.Web.UI.Page.LoadPageStateFromPersistenceMedium() 
    at System.Web.UI.Page.LoadAllState() 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    at System.Web.UI.Page.ProcessRequest() 
    at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) 
    at System.Web.UI.Page.ProcessRequest(HttpContext context) 
    at ASP.mobile_inbox_aspx.ProcessRequest(HttpContext context) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 
+0

(supprimé ma réponse que je ne l'ai pas repérer les « VIEWSTATE » bit) –

Répondre

3

Vous pouvez implémenter un objet ViewStatePersister personnalisé qui gère cela. Vous voulez probablement le dériver de HiddenFieldPageStatePersister. Jetez un oeil à this article qui montre comment implémenter la compression au-dessus de ViewState, mais est très similaire à ce que vous devez faire.

Il y a un peu de hackiness impliqué: vous devez utiliser la réflexion pour définir un champ de la classe de base StateFormatter qui est, contrairement à ce que l'MSDN docs dire, pas marqué comme virtuel ne peut donc pas être contournée sans réflexion .

-1

Utilisez la solution ci-dessous et vérifiez si cela fonctionne. Ça marche pour moi. Ajoutez ce code dans votre code asp.net derrière lequel est à l'origine du problème. Ci-dessous le code est en vb.net

Protected Overrides Function LoadPageStateFromPersistenceMedium() As Object 
     Return Session("_ViewState") 
    End Function 
Protected Overrides Sub SavePageStateToPersistenceMedium(viewState As Object) 
     Session("_ViewState") = viewState 
    End Sub 
+0

Vous devez fournir le code dans le langage de programmation la question demande, * pas * le langage de programmation de votre choix. – cybermonkey

Questions connexes