我在我的 Wcf 服务项目中使用 Castle windsor 3.0。我使用 Topshelf 将其托管为 Windows 服务项目。我所有的 wcf 服务配置都在 app.config 文件中。我正在使用城堡 wcffacility 并注册这样的服务 -
Container.AddFacility<WcfFacility>();
Container.AddFacility<LoggingFacility>(f => f.UseLog4Net());
container.Register(
Classes
.FromThisAssembly()
.Pick()
.If(x => x.IsClass
&& HasServiceContract(x))
.WithServiceDefaultInterfaces()
.Configure(c => c.AsWcfService().LifeStyle.HybridPerWcfOperationTransient()));
这会将 ILog(来自 log4net)注入我的服务而没有任何问题,但它无法注入 IErrorHandler。
我添加了带有 IErrorHandler 的 ServiceBehaviour,以便我可以捕获用户未处理的异常并使用以下代码记录错误。
#region IErrorHandler Members
public ILog Logger { get; set; }
public bool HandleError(Exception error)
{
if (error is FaultException)
return false; // Let WCF do normal processing
return true; // Fault message is already generated
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
var uniqueKey = UniqueKeyGenerator.Generate();
//create the custom wcfexception before passing that to client
var wcfException = new CustomServerException("Unknown Error has occured. Please contact your administrator!", uniqueKey);
//log the exception
Logger.Error(uniqueKey, error);
MessageFault messageFault = MessageFault.CreateFault(
new FaultCode("Sender"),
new FaultReason(wcfException.Message),
wcfException,
new NetDataContractSerializer());
fault = Message.CreateMessage(version, messageFault, null);
}
我查看了这个 stackoverflow帖子,但它太旧了,没有发布答案,所以我发布了这个新问题。
更新
我用 grayAlien 提供的答案解决了这个问题(部分暂时)。我所要做的就是
将自定义服务行为类注册到城堡温莎。
Container.Register( Component.For<IServiceBehavior>() .ImplementedBy<PassThroughExceptionHandlingBehaviour>() .Named("IServiceBehavior")
从 app.config 文件中删除 serviceBehaviour 扩展。当我在配置文件中添加行为扩展时,由于某种原因,城堡无法注入依赖项,而是我认为 Wcf 正在创建新实例并且记录器公共属性结果为空。
它现在对我有用,但需要了解(将来)如何使用行为扩展来注入依赖项。