我正在尝试记录/保留我的所有请求/响应,并且认为我尝试使用全局属性,但是当我去实际使用repo时,它是null?这可能吗?
还有其他方法可以实现我的目标吗?
谢谢你, 斯蒂芬
属性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class LogRequestAttribute : RequestFilterAttribute
{
public IRepository Repo { get; set; }
public LogRequestAttribute(ApplyTo applyTo)
: base(applyTo)
{
this.Priority = -200;
}
public LogRequestAttribute()
: this(ApplyTo.All) {}
public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto)
{
try
{
// Convert the req obj into something that can be persisted...
Repo.LogRequest("Logging the rquest");
}
catch (Exception ex)
{
System.Diagnostics.Trace.TraceError(ex.ToString());
}
}
}
AppHost配置
public override void Configure(Container container)
{
//Set JSON web services to return idiomatic JSON camelCase properties
ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;
//Show StackTrace in Web Service Exceptions
SetConfig(new EndpointHostConfig { DebugMode = true });
//Register any dependencies you want injected into your services
container.Register<ICacheClient>(new MemoryCacheClient());
/* // Redis
container.Register<IRedisClientsManager>(c => new PooledRedisClientManager());
container.Register<IRepository>(c => new Repository(c.Resolve<IRedisClientsManager>()));*/
container.Register<IRepository>(new Repository());
container.Register<IBusinessService>(new BusinessService());
//Configure Custom User Defined REST Paths for your services
/*ConfigureServiceRoutes();*/
//Add a request filter to check if the user has a session initialized
/*this.RequestFilters.Add((httpReq, httpResp, requestDto) =>
{
var sessionId = httpReq.GetCookieValue("user-session");
if (sessionId == null)
{
httpResp.ReturnAuthRequired();
}
});*/
RequestFilters.Add((httpReq, httpResp, requestDto) => new LogRequestAttribute().Execute(httpReq, httpResp, requestDto));
}
存储库
public interface IRepository
{
void LogRequest(string request);
void LogResponse(string request);
}
public class Repository : IRepository
{
private static readonly ILog Log = LogManager.GetLogger("API.Repository");
public Repository()
{
}
public void LogRequest(string request)
{
Log.Debug(request);
}
public void LogResponse(string request)
{
Log.Debug(request);
}
}
更新
//Add a 'global' request filter
this.RequestFilters.Add((httpReq, httpResp, requestDto) =>
{
/* Code here */
});
//Add a 'global' response filter
this.ResponseFilters.Add((httpReq, httpResp, responseDto) =>
{
/* Code here */
});
答案 0 :(得分:4)
如果您尝试在ServiceStack中记录请求,则应该查看Request Logger插件是否有用。 RequestLogsFeature Plugin允许您使用自己的自定义IRequestLogger,而不是默认使用的InMemoryRollingRequestLogger。
虽然你已经正确定义了一个请求过滤器属性,但你没有正确应用它,它应该像任何其他C#属性一样使用(即装饰)。只需服务类型,请求DTO 或服务操作 它只运行到它们应用的范围。
没有全局请求过滤器属性,Filter Attributes只允许您指定要执行的委托,这就是这里发生的一切:
RequestFilters.Add((httpReq, httpResp, requestDto) =>
new LogRequestAttribute().Execute(httpReq, httpResp, requestDto));
LogRequestAttribute 类型的新实例是内联构造的(如上所示,未从IOC解析),因此它不是自动连接的。您调用的方法是FilterAttribute的一个实例是无关紧要的,因为所有C#委托都在调用空的LogRequestAttribute实例上的方法。
如果在Configure()
内注册全局过滤器,您可以直接访问container
,例如:
RequestFilters.Add((httpReq, httpResp, requestDto) =>
container.Resolve<IRepository>().LogRequest("Logging the request"));
在其他任何地方,您都可以使用单身人士AppHostBase.Resolve<T>()
访问ServiceStack的IOC。