2009-07-10 10 views
7

Ich habe einen Webservice mit einer Methode, die über ein xmlhttprequest Objekt in meinem Javascript aufgerufen wird. Die Methode akzeptiert einen Datetime-Parameter, der anschließend in eine Zeichenfolge konvertiert wird und für eine Berechnung in der Datenbank ausgeführt wird.Proper DateTime Format für einen Web Service

ich den Wert von m_txtDateAdd und das XMLHttpRequest abzuschicken

<asp:textbox id=m_txtDateAdd tabIndex=4 runat="server" Width="96px" Text="<%# Today %>"> 
</asp:textbox> 

, die einen Validator es attacted hat

<asp:CustomValidator id="m_DateAddValidator" runat="server" ErrorMessage="Please Enter a Valid Date" ControlToValidate="m_txtDateAdd">&#x25CF;</asp:CustomValidator> 

Mein Webmethod sieht so etwas wie dieses

[WebMethod] 
public decimal GetTotalCost(DateTime transactionDate) 
{ 
    String sqlDateString = transactionDate.Year+"/"+transactionDate.Month+"/"+transactionDate.Day; 

I benutze sqlDateString als Teil des commandtext, den ich an die Datenbank sende. Es ist eine Legacy-Anwendung und seine Inline-SQL, so dass ich nicht die Freiheit habe, eine gespeicherte Prozedur einzurichten und Parameter in meinem Code zu erstellen und zuzuweisen. Dies funktioniert 90% der Zeit. Der Webservice wird beim onchange-Event von m_txtDateAdd aufgerufen. Hin und wieder die Antwort, die ich vom Server bekomme, ist

System.ArgumentException: kann nicht konvertieren 25/06/2009 zu System.DateTime. System.ArgumentException: 25/06/2009 kann nicht in System.DateTime konvertiert werden.

Parametername: type ---> System.FormatException: String wurde nicht als gültige DateTime erkannt.

at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles) 
    at System.DateTime.Parse(String s, IFormatProvider provider) 
    at System.Convert.ToDateTime(String value, IFormatProvider provider) 
    at System.String.System.IConvertible.ToDateTime(IFormatProvider provider) 
    at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) 
    at System.Web.Services.Protocols.ScalarFormatter.FromString(String value, Type type) 
    --- End of inner exception stack trace --- 
    at System.Web.Services.Protocols.ScalarFormatter.FromString(String value, Type type) 
    at System.Web.Services.Protocols.ValueCollectionParameterReader.Read(NameValueCollection collection) 
    at System.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequest request) 
    at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters() 
    at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest() 
+0

Können Sie den benutzerdefinierten Validatorcode anzeigen? Der Serializer wird versuchen, Ihre Zeichenfolge mit Standardformatierung zu konvertieren, die nur ein paar grundlegende Formate verstehen kann. Der Validierer sollte sicherstellen, dass ein bekanntes Format übermittelt wird. –

+0

Es ist ein standard asp.net benutzerdefinierter Validator. Ich habe keine eigene geschrieben – user48408

Antwort

10

Sie müssen eine DateTime im richtigen Format für XML senden: 2009-07-10T12: 40Z. Von http://en.wikipedia.org/wiki/ISO_8601.


Warum verwenden Sie auch HttpRequest? Warum nicht einfach Service-Referenz hinzufügen?

+0

Es gibt kein "korrektes Format für XML", aber es gibt ein korrektes Format für XML-Schema. Achten Sie darauf, die beiden nicht zu verwechseln. Wenn der XML-Verbraucher ein JavaScript-Client ist, ist das ISO-Datumsformat möglicherweise nicht hilfreich. – skaffman

+0

Sein Dienst akzeptiert DateTime. XML Serializer verwendet XSD-Formate immer zum Deserialisieren und Serialisieren, sofern IXmlSerializable nicht implementiert ist und nicht auf DateTime steht. –

+0

Eine wichtige Sache zu erinnern, dass ich sagte, dass Daten erfolgreich zu 90% + der Zeit zurückgegeben werden. Wiederholtes Ändern des Datums führt schließlich zu der Ausnahme, aber es gibt keine Konsistenz in dem Sinne, dass das Eintreten am 01.07.2009 immer wieder dazu führen wird, dass es scheitert. mit xmlhttprequest, so dass Sie nicht eine vollständige Seite aktualisieren – user48408

0

Übergeben Sie den String-Wert aus dem Textfeld direkt an den Webservice? Es wäre zuverlässiger, die Benutzereingabestring in ein JavaScript-Date-Objekt zu zerlegen, das Date-Objekt an den Webservice zu übergeben und den Serialisierer in der Microsoft-Ajax-Bibliothek herauszufinden, wie es formatiert wird.

Es kann hilfreich sein, den clientseitigen Javascript-Code zu sehen, der den Wert erhält und den Web-Service aufruft.

3

2001-10-26T19: 32: 52Z

Verwendung solchen Format.