GARANTIR DESCONTO

Fórum Parametro tipo Datetime em um WebService #4609

17/04/2009

0

Ola, estou desenvolvendo um WebService on o mesmo recebe um parametro tipo datetime, porem ao testar o servico no Iexplorer, ao colocar uma data como "23/04/2009" me é retornado a seguinte mensagem de erro: System.ArgumentException: Não é possível converter 23/04/2009 em System.DateTime. Nome do parâmetro: type ---> System.FormatException: Seqüência não foi reconhecida como DateTime válido. em System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles) em System.Convert.ToDateTime(String value, IFormatProvider provider) em System.String.System.IConvertible.ToDateTime(IFormatProvider provider) em System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) em System.Web.Services.Protocols.ScalarFormatter.FromString(String value, Type type) --- Fim do rastreamento da pilha de exceções internas --- em System.Web.Services.Protocols.ScalarFormatter.FromString(String value, Type type) em System.Web.Services.Protocols.ValueCollectionParameterReader.Read(NameValueCollection collection) em System.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequest request) em System.Web.Services.Protocols.HttpServerProtocol.ReadParameters() em System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()No mesmo webservice tambem quando tento retornar uma listagem , IList, ou o obejeto em si me e retornado o seguinte erro:System.InvalidOperationException: Erro ao gerar o documento XML. ---> System.InvalidOperationException: Foi detectada uma referência circular durante a serialização de um objeto do tipo SICFin.WS.Agenda. em System.Xml.Serialization.XmlSerializationWriter.WriteStartElement(String name, String ns, Object o, Boolean writePrefixed, XmlSerializerNamespaces xmlns) em Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write5_Agenda(String n, String ns, Agenda o, Boolean isNullable, Boolean needType) em Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write4_Cliente(String n, String ns, Cliente o, Boolean isNullable, Boolean needType) em Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write5_Agenda(String n, String ns, Agenda o, Boolean isNullable, Boolean needType) em Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType) em Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write7_ArrayOfAnyType(Object o) em Microsoft.Xml.Serialization.GeneratedAssembly.IListSerializer.Serialize(Object objectToSerialize, XmlSerializationWriter writer) em System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) --- Fim do rastreamento da pilha de exceções internas --- em System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) em System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces) em System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o) em System.Web.Services.Protocols.XmlReturnWriter.Write(HttpResponse response, Stream outputStream, Object returnValue) em System.Web.Services.Protocols.HttpServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream) em System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues) em System.Web.Services.Protocols.WebServiceHandler.Invoke()   Não sei se os 2 erros tem relacao, mas acontece soemnte com este webservice.e somente este tem parametro do tipo datetime. Estou ustilizando SQLServer e LinqToSql.
Fabricio Santos

Fabricio Santos

Responder

Posts

17/04/2009

Fabio Mans

Olá esta data está sendo passada como parâmetro?   Tente fazer um tratamento antes.   DateTime dtNasc = new DateTime(1986, 06, 24);   Ele não está entendendo o formato dd/MM/yyyy      
Responder

Gostei + 0

17/04/2009

Fabricio Santos

Nao achei uma forma de realizar o tratamento, pois o erro acontece antes da primeira linha do meu código do webserver. Ele so esta aceitando passar parametro no formato MM/DD/AAAA quando tento passar no formato DD/MM/AAAA da o erro. Tentei debugar , mas nao consigo pois como te disse o erro ocorre antes de entra no WEBMethod.   Outra coisa que ja tentei foi colocar a seguinte linha no web.config: <globalization uiCulture="pt-BR" culture="pt-BR" requestEncoding="utf-8" responseEncoding="utf-8" enableClientBasedCulture="true" responseHeaderEncoding="utf-8"/>   Porem ainda continua dando o problema.   Segue abaixo o fonte do webservice:   using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Xml.Serialization; using System.Collections; namespace SICFin.WS { /// <summary> /// Summary description for Agendas /// </summary> [WebService(Namespace = "http://localhost/SICFin/ws/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class Agendas : System.Web.Services.WebService { [WebMethod] public int Salva(int pId, DateTime pData, int pCliente, string pUsuario, bool pConfirmada) { int retorno = 0; SICFinDataContext dc = new SICFinDataContext(); if (pId == 0) { Agenda agenda = new Agenda(); agenda.Id = pId; agenda.Data = pData; agenda.Cliente_id = pCliente; agenda.Usuario_id = pUsuario; agenda.Confirmada = pConfirmada; dc.Agendas.InsertOnSubmit(agenda); dc.SubmitChanges(); retorno = agenda.Id; } else { var agenda = (from c in dc.Agendas where c.Id.Equals(pId) select c).Single(); agenda.Id = pId; agenda.Data = pData; agenda.Cliente_id = pCliente; agenda.Usuario_id = pUsuario; agenda.Confirmada = pConfirmada; dc.SubmitChanges(); retorno = agenda.Id; } dc.Dispose(); return retorno; } [WebMethod] [XmlInclude(typeof(Agenda))] public IList Lista(string usuario) { SICFinDataContext dc = new SICFinDataContext(); var query = from c in dc.Agendas orderby c.Id where c.Usuario_id.Equals(usuario) select c; return query.ToList(); } [WebMethod] public Agenda Retornar(int pId) { SICFinDataContext dc = new SICFinDataContext(); var query = (from c in dc.Agendas orderby c.Id where c.Id.Equals(pId) select c).Single(); return query; } [WebMethod] public void Exclui(int pId) { SICFinDataContext dc = new SICFinDataContext(); var agenda = (from c in dc.Agendas orderby c.Id where c.Id.Equals(pId) select c).Single(); dc.Agendas.DeleteOnSubmit(agenda); dc.SubmitChanges(); } } }
Responder

Gostei + 0

17/04/2009

Fabio Mans

Veja no painel de controle do seu windows se o formato de data está DD/MM/AAAA


O System.DateTime é um value type que representa os horários e datas entre 00:00:00 de 1 de Janeiro de 0001 AD e 11:59:59 de 31 de Janeiro de 9999 AD. Quando falamos, no .NET, em unidade representação de tempo, devemos ter em mente que tal medida é feita baseando-se em intervalos de décimos de microsegundos (1x10E-7 segundos ou, em termos frequência, 10MHz) - os chamados ticks. Temos, portanto, uma grande a precisão nas operações com tempo.

O primeiro ponto crítico a se discutir quando lidamos com datas é a questão das culturas, zonas (fusos) e economia de energia (Daylight Saving). De fato, deveria ser uma prática comum armazenarmos as datas das nossas aplicações corporativas globalizadas em Universal Time Coordinates (UTC) – este horário universal também é conhecido como Greenwich Mean Time (GMT).

A regra fundamental neste tipo de tarefa é que só existe relevância em um cálculo ou comparação de datas se as instâncias de DateTime forem criadas na mesma zona. Adicionamos a este zelo pelas zonas o fato de termos, também, os períodos de economia de energia, no Brasil conhecido como o horário de verão.

Com o Regional Options configurado para [portuguese (Brazil)] e a Time Zone para [(GMT – 03:00) Brasilia], ao executamos o seguinte método:

DateTime d = DateTime.Parse("3/25/2004");

Obtemos uma FormatException dizendo que a string não foi reconhecida como um DateTime válido. Ocorre que, para lidarmos com datas em formatos diferentes da configuração regional local, devemos informar um objeto que implementa a interface IFormatProvider. Esta interface visa apresentar informações sobre a cultura, e uma das classes que a implementa é a CultureInfo.

System.Globalization.CultureInfo _ci =
  new System.Globalization.CultureInfo("en-US");
DateTime d = DateTime.Parse("3/25/2004", _ci);

d é sua Data, trate como o exemplo.

E depois faça o seguinte tratamento.
string str = "07/12/2007";DateTime dt = DateTime.ParseExact(str, "dd/MM/yyyy", null);




Responder

Gostei + 0

22/04/2009

Fabio Mans

O Senhor conseguiu resolver?
Responder

Gostei + 0

22/04/2009

Devmedia

Fabrício,
a resposta do consultor solucionou sua dúvida? Podemos encerrar o chamado?
Responder

Gostei + 0

23/04/2009

Fabricio Santos

Bom dia, ainda nao me foi passa uma maneira de se passar a data no formato pt-BR, gostaria de uma reposta definitiva se isto é possível ou se terei que utilizar outros artifícios, como os descritos nas repostas do consultor.
Responder

Gostei + 0

23/04/2009

Fabio Mans

Você pode colocar no Web.Config.   <system.web>   <globalization enableClientBasedCulture="false" requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="iso-8859-1" responseHeaderEncoding="utf-8" resourceProviderFactoryType="string" enableBestFitResponseEncoding="true" culture="pt-BR" uiCulture="pt-BR"/>   </system.web> E também tentar utilizando o código abaixo. DATETIME como padrão brasileiro DateTime thisDate = new DateTime(2009, 3, 15);
CultureInfo culture = new CultureInfo("pt-BR");     
string dataBR = thisDate.ToString("d", culture);  // Saida = 15/3/2008
Responder

Gostei + 0

23/04/2009

Fabricio Santos

Boa Tarde, coloquei a linha solicitada no web.config, mas mesmo assim permaneceu o mesmo erro.
Responder

Gostei + 0

23/04/2009

Fabio Mans

Eu o tratamento da data você fez como eu citei?
A data é um parâmetro do WebService?
Responder

Gostei + 0

23/04/2009

Fabricio Santos

Boa noite, sim a data e um parametro, e não tenho como testar o codigo que citou, pois o erro acontece na passagem do parametro. Antes mesmo de executar a primeira linha do webservice. Estou testando o webservice a principio via browser. Fabricio
Responder

Gostei + 0

23/04/2009

Fabio Mans

agenda.Data é string ou Datetime?


agenda.Data = pData;
Responder

Gostei + 0

23/04/2009

Fabio Mans

Acabei de fazer um sistema que é um parâmetro DateTime


PessoaVo.Nascimento = Convert.ToDateTime(TxtNasc.Text);

Nascimento é DateTime, tente fazer como eu fiz.

Fabio


Responder

Gostei + 0

23/04/2009

Fabricio Santos

Ok.. funcionou.. pode encerrar o chamado
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar