为了记录每个WebApi请求/响应的JSON,我创建了一个自定义DelegatingHandler
并将其添加到MessageHandlers
中的WebApiConfig.cs
集合中,并且效果很好。
将来,我希望能够通过web.config
在其他WebApi应用程序上启用此处理程序,而无需实际修改WebApiConfig.cs
。
作为澄清,我想要实现的是类似于WCF中可能的内容,您可以创建一个完全独立的dll,将其放入WCF服务的bin文件夹中,并将其添加到WCF管道中通过编辑web.config文件而不必修改服务的来源。
这是否可以在WebApi中使用,或者只能在运行时通过代码添加自定义DelegatingHandler
?
答案 0 :(得分:0)
经过一番研究后,我正在回答我自己的问题。如果不必修改目标应用程序的源代码,这似乎是不可能的。如果在编写应用程序期间给出了一些想法并且知道要查找它,则可以在启动时动态加载或注入这样的处理程序。另一种可能的解决方案是将日志记录处理程序创建为nuget包,当nuget包安装到目标应用程序中时,安装程序将添加dll并创建一个WebActivator
挂钩,将处理程序添加到{{1 MessagingHandlers
中的集合。这可能是涉及最少量手动代码更改的方法,但仍需要重新编译和重新部署目标应用程序。
答案 1 :(得分:0)
修改处理程序以检查配置并在启用时执行其功能,否则只需让请求通过。如果用于记录,请确保在管道的早期添加。如果可能,请考虑使用中间件。
public class LoggingHandler : DelegatingHandler {
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
var appSetting = ConfigurationManager.AppSettings["LoggingHandlerEnabled"];
var enabled = true;
bool.TryParse(appSetting, out enabled);
if(enabled) {
//...Extract and log request
LogRequest(request);
}
// Execute the request and get the response
var response = await base.SendAsync(request, cancellationToken);
if(enabled) {
//...Extract details from response for logging
LogResponse(response);
}
return response;
}
private void LogRequest(HttpRequestMessage request) {
//... code removed for brevity
}
private void LogResponse(HttpResponseMessage response) {
//... code removed for brevity
}
}
有了这个,那么就没有必要再修改任何代码来启用/禁用处理程序了。更新配置文件,处理程序将遵循设置。
答案 2 :(得分:-1)
在ASP.NET Web API 2中进行跟踪
从Tools菜单中,选择Library Package Manager,然后选择Package Manage Console。
在“程序包管理器控制台”窗口中,键入以下命令。
Install-Package Microsoft.AspNet.WebApi.Tracing
Update-Package Microsoft.AspNet.WebApi.WebHost
第一个命令安装最新的Web API跟踪包。它还会更新核心Web API包。第二个命令将WebApi.WebHost包更新为最新版本。
打开App_Start文件夹中的文件WebApiConfig.cs
。将以下代码添加到Register方法。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// New code
config.EnableSystemDiagnosticsTracing();
// Other configuration code not shown.
}
}
此代码将SystemDiagnosticsTraceWriter
类添加到Web API管道。 SystemDiagnosticsTraceWriter
类将跟踪写入System.Diagnostics.Trace
。
要查看跟踪,请在调试器中运行该应用程序。在浏览器中,导航至/api/values
。
trace语句将写入Visual Studio中的“输出”窗口。 (从“视图”菜单中选择“输出”。