none
Não consigo dar saída para o cliente em uma exceção ocorrida no meu serviço. RRS feed

  • 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

    domingo, 4 de abril de 2010 13:54

Respostas

Todas as Respostas