2010-11-18 31 views
1

J'ai une application ASP .NET Web Forms qui utilise l'attribut 'WebMethod' pour effectuer des appels AJAX à partir de jQuery. Je fais face à essayer de localiser l'application, donc je récemment créé une méthode Web qui ressemble à ceci à des fins de test:Pourquoi le thread CultureInfo du thread actuel n'est-il pas utilisé lors de l'analyse d'un paramètre DateTime lors d'un appel "WebMethod" dans ASP .NET?

[WebMethod] 
public static string HandleDate(DateTime dateValue) 
{ 
    return dateValue.ToString("f"); 
} 

Le point de cette méthode est de vérifier que si je mets le CultureInfo correctement le web La méthode analysera correctement la date fournie en utilisant les règles de mise en forme de la date pour cette culture. Malheureusement, ce code n'est jamais atteint. Au lieu de cela, je vois une erreur soulevée par les classes auxiliaires qui permettent d'appeler ces WebMethods.

J'ai un HttpModule qui définit les propriétés 'CurrentCulture' et 'CurrentUICulture' du thread en cours à 'pt-BR' (portugais brésilien) à l'événement 'BeginRequest'.

Côté client, j'ai un appel jQuery AJAX à cette méthode Web 'HandleDate' qui fournit le paramètre dateValue en tant que '18/10/2010 '. Dans la culture «pt-BR», cela devrait se faire jusqu'au 18 octobre 2010 (format de date jour/mois/année). Lorsque j'exécute cela, je reçois une erreur indiquant que le 'System.Web.Script.Serialization.ObjectConverter' explose, indiquant que '18/11/2010' n'est pas une valeur valide pour DateTime. La trace de pile incluse avec l'erreur indique que cela a été lancé par la méthode 'System.ComponentModel.DateTimeCoverter.ConvertFrom', qui accepte l'objet à convertir en plus d'un objet CultureInfo représentant la culture qui doit être appliquée pendant la conversion.

J'ai démarré Reflector et il semble que le 'ObjectConverter' appelle le 'DateTimeConverter' en utilisant l'instance de CultureInfo.InvariantCulture, ce qui me semble être le problème.

Comment puis-je forcer cette logique à utiliser le CultureInfo attaché au thread actuel au lieu de l'InvariantCulture?

+0

Je pense qu'il fait exploser en essayant de convertir '18/10/2010 'à un DateTime afin qu'il puisse être passé à la méthode, et n'a rien à voir avec votre code 'dateValue.ToString (" f ")' – Greg

+1

Yah , le code à l'intérieur de la méthode n'est jamais réellement atteint. C'est définitivement en train de faire l'analyse de la date, mais je veux savoir pourquoi. Je vais clarifier un peu la question. –

Répondre

1

Je vous recommande de changer le type de paramètre à string puis faire vous-même en utilisant l'analyse syntaxique DateTime.Parse ou TryParse.

+0

Tout compte fait, c'est probablement ce que je vais faire. Je pensais que c'était un comportement un peu étrange d'analyser les dates avec la culture Invariant et je veux savoir pourquoi. Plus j'y pense, plus je pense que l'utilisation de la culture Invariant a très bien pu être une décision "par conception" de Microsoft. –

+0

Rappelez-vous que cette infrastructure a été créée pour les services Web SOAP. Il existe une norme internationale pour les chaînes de date/heure dans ces services, il n'y a donc aucune question sur la façon d'analyser les dates. –

+0

Yah, je suis d'accord. Je pense qu'il s'agit d'un by-design qui influencera probablement la façon dont je fournis des chaînes de date aux appels AJAX (c'est-à-dire en utilisant les formats ISO et en utilisant 'ParseExact'.) Accepter cette réponse. –