Estou usando o Microsoft Asp.net WebApi2 hospedado no IIS. Eu gostaria muito simplesmente de registrar o corpo da solicitação (XML ou JSON) e o corpo da resposta para cada postagem.
Não há nada de especial neste projeto ou no controlador que processa a postagem. Não estou interessado em usar estruturas de registro como nLog, elmah, log4net ou os recursos de rastreamento integrados da API da web, a menos que seja necessário fazer isso.
Estou simplesmente querendo saber onde colocar meu código de registro e como obter o JSON ou XML real da solicitação e resposta de entrada e saída.
Meu método de postagem do controlador:
public HttpResponseMessage Post([FromBody])Employee employee)
{
if (ModelState.IsValid)
{
// insert employee into to the database
}
}
c#
asp.net-web-api
user2315985
fonte
fonte
Respostas:
Eu recomendaria usar um
DelegatingHandler
. Então você não precisará se preocupar com nenhum código de registro em seus controladores.Basta substituir
Trace.WriteLine
por seu código de registro e registrar o manipuladorWebApiConfig
assim:Aqui está a documentação completa da Microsoft para manipuladores de mensagens .
fonte
task.Result.Content
retornaSystem.Net.Http.ObjectContent
. Existe uma maneira de obter o xml / json bruto em vez disso?ContinueWith
eResult
são APIs perigosas. Seria muito melhor usar emawait
vez disso, ou seja,var result = await base.SendAsync(request, cancellationToken); var resposeBody = await response.Content.ReadAsStringAsync(); Trace.WriteLine(responseBody); return response;
await request.Content.ReadAsStringAsync();
não resulta em um erro informando que o fluxo de solicitação já foi lido em certas circunstâncias?Existem várias abordagens para lidar genericamente com o registro de Solicitação / Resposta para todas as chamadas de método WebAPI:
ActionFilterAttribute
: Pode-se escreverActionFilterAttribute
métodos personalizados e decorar os métodos de controle / ação para habilitar o registro.Contra: Você precisa decorar cada controlador / método (ainda pode fazer isso no controlador de base, mas ainda não aborda questões transversais.
Substitua
BaseController
e controle o registro lá.Contra: Estamos esperando / forçando os controladores a herdar de um controlador de base personalizado.
Usando
DelegatingHandler
.Vantagem: Não estamos mexendo no controlador / método aqui com esta abordagem. O manipulador de delegação fica isolado e trata perfeitamente o registro de solicitações / respostas.
Para obter mais artigos detalhados, consulte este http://weblogs.asp.net/fredriknormen/log-message-request-and-response-in-asp-net-webapi .
fonte
Uma das opções que você tem é criar um filtro de ação e decorar seu WebApiController / ApiMethod com ele.
Atributo de filtro
Controlador WebApi
ou
Espero que isto ajude.
fonte
Obter acesso para solicitar mensagem é fácil. Sua classe base
ApiController
contém.Request
propriedade que, como o nome sugere, contém a solicitação na forma analisada. Você simplesmente examina o que deseja registrar e passa para a sua instalação de registro, seja ele qual for. Este código você pode colocar no início de sua ação, se precisar fazê-lo por apenas um ou um punhado.Se você precisa fazer isso em todas as ações (todas significando mais do que um punhado gerenciável), então o que você pode fazer é substituir o
.ExecuteAsync
método para capturar cada chamada de ação para seu controlador.fonte
ExecuteAsync
é o que é chamado pelo framework, e a implementação da classe do controlador base é o que realmente executa a ação. Isso é apenas chamar o seu registro como parte da execução que já está acontecendo. A única penalidade aqui é o momento de fazer o registro real.Este parece ser um tópico muito antigo, mas vale a pena compartilhar outra solução.
Você pode adicionar este método em seu arquivo global.asax, que será acionado a cada após o término da solicitação HTTP.
fonte
Esse é um tópico muito antigo, mas eu gastei muito tempo (pesquise na internet) fazendo essas coisas, então irei apenas postar minha solução aqui.
Conceito
1. MyController.cs
2. APIActionFilter.cs
3. APIExceptionFilter.cs
fonte