Usuário com melhor resposta
Não consigo dar saída para o cliente em uma exceção ocorrida no meu serviço.

Pergunta
-
Ao ser requisitado pelo cliente o meu serviço está gerando uma exceção que não consigo dar saída para o cliente, ou seja, como estou usando no cliente "this.proxy.InnerChannel.Faulted += new EventHandler(InnerChannel_Faulted);" para recriar o proxy, então ele não gera a exceção e fica em loop. Isso só ocorre no meu caso, quando a exceção é gerada pelo banco. Segue o trace:
"at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
at System.Data.Linq.DataContext.ExecuteMethodCall(Object instance, MethodInfo methodInfo, Object[] parameters)
at wsControleAcesso.toBusinessDataContext.proc_SetVendaCodigoDeAcesso(Nullable`1 codAcesso, Nullable`1 codCliente, Nullable`1 idPeriodo, Nullable`1 idVendedor, Nullable`1 usuarioUltimaAlteracao) in C:\Documents and Settings\Administrator\My Documents\Desenvolvimento\Aplicacoes\ControleDeAcesso\wsControleAcesso\toBusiness.designer.cs:line 298
at wsControleAcesso.ServicodeControleDeAcesso.LiberaCodigoParaUso(CodigoDeAcesso codigo, Int32 idvendedor) in C:\Documents and Settings\Administrator\My Documents\Desenvolvimento\Aplicacoes\ControleDeAcesso\wsControleAcesso\ServicodeControleDeAcesso.svc.cs:line 293"Segue o restante do código:
Serviço (método disponibilizado no serviço)
" public void LiberaCodigoParaUso(CodigoDeAcesso codigo, int idvendedor)
{
using (DataBaseContext banco = new DataBaseContext())
{
try
{var query = banco.proc_SetVendaCodigoDeAcesso
(codigo.CodigoAcesso,
codigo.Cliente,
codigo.IdPeriodo,
idvendedor,
idvendedor);}
catch (ServicoException ex)
{
RetornaErroTratado err1 = new RetornaErroTratado();
err1.CodigoDoErro = 0;
err1.DescricaoDoErro = ex.Message;
err1.DetalhesDoErro = ex.StackTrace + " - " + ex.Source;
err1.ExcecaoOcorrida = ex;throw new FaultException<RetornaErroTratado>(err1);
}
catch (SqlException sqlex)
{
throw new FaultException<SqlException>(sqlex,
new FaultReason("Não foi possível realizar o processo no banco de dados."),
new FaultCode("SqlException"));}
}
}
"Cliente:
private string LiberaCartao()
{
string retorno = string.Empty;CodigoDeAcesso codigo = new CodigoDeAcesso();
codigo.CodigoAcesso = Convert.ToInt64(this.txtcodigo.Text);
codigo.IdPeriodo = Convert.ToInt32(this.ltbquantidade.SelectedValue);
codigo.Cliente = 1;try
{
StringBuilder str = new StringBuilder();proxy.LiberaCodigoParaUso(codigo, 1);
str.Append("Acesso Liberado \n\n");
str.Append("Período de " + this.lbltextoqtde.Text + " " + this.lbltextoperiodo.Text + "(s) \n\n ");
str.Append("Liberação efetuada às: \n" + DateTime.Now.ToLongDateString() + "\n\n");this.txtcodigo.Enabled = false;
retorno = str.ToString();
str = null;}
catch (FaultException<RetornaErroTratado> ex)
{
retorno = ex.Detail.DescricaoDoErro;
}
catch (SqlException sqlex)
{
retorno = sqlex.Message;
}codigo = null;
return retorno;
}
"Desde já agradeço qualquer ajuda.
Obrigado
Respostas
-
Boas Bruno,
Acredito que o seu problema esteja durante a execução da query no Linq To SQL.
Outro detalhe é que você não deveria tratar o SqlException no cliente, pois isso deveria ser transparente para cliente. Da mesma forma que fez com o erro da regra de negócio com a FaultContract, deveria utilizar essa mesma técnica com a SqlException. Veja se isso pode te ajudar: http://www.israelaece.com/post/Utilizando-Exceptions-como-Faults.aspx
http://www.israelaece.com- Sugerido como Resposta Israel AeceModerator sexta-feira, 16 de abril de 2010 11:18
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 25 de junho de 2010 18:20
Todas as Respostas
-
Boas Bruno,
Acredito que o seu problema esteja durante a execução da query no Linq To SQL.
Outro detalhe é que você não deveria tratar o SqlException no cliente, pois isso deveria ser transparente para cliente. Da mesma forma que fez com o erro da regra de negócio com a FaultContract, deveria utilizar essa mesma técnica com a SqlException. Veja se isso pode te ajudar: http://www.israelaece.com/post/Utilizando-Exceptions-como-Faults.aspx
http://www.israelaece.com- Sugerido como Resposta Israel AeceModerator sexta-feira, 16 de abril de 2010 11:18
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 25 de junho de 2010 18:20
-
Israel,
muito obrigado pela dica. Irei verificar.
Retorno assim que tiver uma posição.Obrigado.
- Sugerido como Resposta Israel AeceModerator sexta-feira, 16 de abril de 2010 11:18
- Não Sugerido como Resposta Israel AeceModerator sexta-feira, 16 de abril de 2010 11:18
-