我已经创建了IDispatchMessageInspector接口的自定义实现,并且我的代码工作得很好。WCF服务主机何时销毁自定义IDispatchMessageInspector?
我的问题是,当WCF服务主机被终止和/或释放我的类的一个实例时,我需要释放一些托管对象。我的对象免费实现IDisposable,但它们不会被丢弃。我已经通过MSDN库(更困惑)和SO归档,但没有发现任何解决“WCF服务主机销毁MessageInspectors的时间/地点?”问题的任何内容。
我需要在某处挂钩事件吗?我是否需要从ServiceModel名称空间实现更加神秘的东西?
任何人都可以给我一个正确的方向指针吗?
编辑1:澄清
目前,我在IDE中使用自动运行的网络服务器。我不是最终在生产中控制主机,可以是任何有效的服务器主机选择。
MyCore.My和MyCore.MyProperties对象是我试图在WCF服务器主机被终止/退回时处理的对象。
即使我杀死了web服务器进程(任务栏中的那些东西),Dispose()也不会被调用。
编辑2:添加了代码片段。
using /* snip */
using MyCore = Acme.My;
namespace My.SOAP
{
public class MyMessageInspector : IDispatchMessageInspector
{
protected static MyCore.My _My;
protected static MyCore.MyProperties _MyProps;
protected static ConcurrentDictionary<string, MyCore.AnotherSecretThing> _anotherSecretThings = new ConcurrentDictionary<string, MyCore.AnotherSecretThing>();
protected static void InitMy()
{
if (_My != null) return;
_MyProps = new MyCore.MyProperties();
MyCore.MySqlDatabaseLogger logger = new MyCore.MySqlDatabaseLogger(_MyProps);
_My = new MyCore.My(logger);
}
public MyMessageInspector()
{
InitMy();
}
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
MyMessageHeader header = null;
try
{
// find My header
Int32 headerPosition = request.Headers.FindHeader(MyMessageHeaderKey.MyHeaderElementName, MyMessageHeaderKey.MyNamespace);
// get reader
XmlDictionaryReader reader = request.Headers.GetReaderAtHeader(headerPosition);
// get My header object
header = MyMessageHeader.ReadHeader(reader);
// add to incoming messages properties dictionary
OperationContext.Current.IncomingMessageProperties.Add(MyMessageHeaderKey.MyHeaderElementName, header);
}
catch (Exception ex)
{
// log via ExceptionHandlingBlock
}
MyCore.SecretThings SecretThings = CreateSecretThings(/* snip */);
return SecretThings.Id;
}
public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
MyCore.SecretThings req = _My.GetSecretThingsOnThread();
// if we didn't find the SecretThings, there is nothing to stop() and no data to put in the MessageHeaders
if (req == null) return;
MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue);
reply = buffer.CreateMessage();
var MyHeader = new MyMessageHeader(/* snip */);
reply.Headers.Add(MyHeader);
req.Stop(MyCore.Status.SUCCESS);
}
protected MyCore.SecretThings CreateSecretThings(string key, Dictionary<string, string> ids)
{
/* snip */
return _My.GetSecretThings(/* snip */);
}
}
}
可我们看到的例子吗?你想要在你的DispatchMessageInspector中处理你的对象吗? – Mike 2012-07-17 20:24:05