Fórum Parametro tipo Datetime em um WebService #4609
17/04/2009
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.
Posts
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
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();
}
}
}
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);
O Senhor conseguiu resolver?
Fabrício,
a resposta do consultor solucionou sua dúvida? Podemos encerrar o chamado?
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.
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
23/04/2009
Fabricio Santos
Boa Tarde,
coloquei a linha solicitada no web.config, mas mesmo assim permaneceu o mesmo erro.
Eu o tratamento da data você fez como eu citei?
A data é um parâmetro do WebService?
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
agenda.Data é string ou Datetime?
agenda.Data = pData;
Acabei de fazer um sistema que é um parâmetro DateTime
PessoaVo.Nascimento = Convert.ToDateTime(TxtNasc.Text);
Nascimento é DateTime, tente fazer como eu fiz.
Fabio
23/04/2009
Fabricio Santos
Ok.. funcionou.. pode encerrar o chamado