none
Manipular exceção do Web Api RRS feed

  • Pergunta

  • Fala pessoal

    Queria pedia a ajuda de voces em um probleminha chato

    to com um projeto em Silverlight usando WebApi para pegar conectar a um banco de dados, o Webapi fica na própria solução, mas em um projeto separado

    Em fim, o problema está nas exceções que acontecem dentro dos Controller

    Chamo os Controller pelo Webapi, quando eles retornam um erro, seja erro do banco ou seja um erro mais particular (caiu em um if e gerei o erro) quando chega no retorno o Webapi ele SEMPRE retorna 404 not found

    Vou explicar mais direito mostrando os trechos do codigo

    Na classe de Controller o metodo a baixo me gera uma Exceção proposital (por exemplo, nao pode deletar o cliente da tabela porque ele tem divida) então 

    [HttpPost] public HttpResponseMessage AdicionarAss(Objetos.Cadastro.AssociacaoEmpFilial AssSelecionado) { try { if(temDivida()) { throw new Exception("O cliente nao pode ser removido porque consta debito");

    }

    //a linha a baixo funciona, retorna exatamente o que quero

    return Request.CreateResponse(HttpStatusCode.OK, "Cliente removido com sucesso); } catch (DbEntityValidationException e) { return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, TrataErroDb(e)); } catch (Exception ex) { return Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message); } }


    Quando não da exceção nenhum, ele funciona legal, me exibe a mensagem que foi deletado com sucesso, mas caso cai nos catch ele me exibe 404 Not found sei la oque

    Achei na internet uma solução que era por o seguinte cógido no metodo que chama o Webapi mas a variavel exe sempre fica null quando era pera vir a mensagem "o cliente nao pode ser removido blablabla" e StatusDescription sempre retorna NotFound quando era pra ser InternalServerError

    	    try
                {
                    //chamada do Webapi
    
                    var request = (HttpWebRequest)WebRequest.Create(new Uri(dynamicEndpoint + controller));
    
                    if (method != "GET")
                        request.ContentType = "application/json";
    
                    request.Method = method;
    
                    //Exceções acontecem nessa linha
                    var response = (HttpWebResponse)(await request.GetResponseAsync());
                    response.GetResponseStream();
                }
                catch(WebException ex)
                {
                    //Tratamento que encontrei na web
                    var exe = ex.Response.GetResponseStream();
                    var msg = new StreamReader(exe).ReadToEnd());
                              ?? ((HttpWebResponse)ex.Response).StatusDescription;
                }

    Valeu pessoal, desde ja agradeço pela leitura

    abraço


    terça-feira, 30 de julho de 2013 15:01

Todas as Respostas

  • 404 => Página não encontrada. Você está dando um response e o que está acontecendo é que esse "Response" não está sendo encontrado, ele não encontra a página ou qualquer outra coisa que deveria retornar nesse response. Coloque um Break Point na exceção e vá debugando, entrando nesses métodos até chegar onde deveria retornar alguma coisa e não está. Aí você verá o que realmente está acontecendo.
    terça-feira, 30 de julho de 2013 17:11
  • pnet obrigado pela resposta, mas esse é o problema ele da 404 mas ele consegue encontrar tudo, ele so da 404 quando eu retorno qualquer coisa diferente de StatusCode.OK.

    Quando ocorre uma exceção no banco por exemplo, se eu retornar "StatusCode.Conflit, ex.Message" ele exibe 404 Notfound se eu retornar a mesma coisa, só que com StatusCode.Ok ele acha que tudo funcionou corretamente e ao inves de retornar por exemplo uma lista de Usuarios e jogar na grid, ele retorna a mensagem de erro e joga na Grid o.O

    No codigo do Controller (onde o Web Api procura) caso caia no 

    throw new Exception("O cliente nao pode ser removido porque consta debito");

    Da 404 Not Found quando era pra dar "O cliente não pode...."



    • Editado Yuri Schmitz terça-feira, 30 de julho de 2013 23:41
    terça-feira, 30 de julho de 2013 23:38