これはそれほど悪くないことが判明しました。 IDispatchMessageInspector
を使用して、すべてのサービスに適用されるServiceBehaviorに入れました。要求がどのようにルーティングされるのか少し不快ですが、うまくいくようです。
public class ConditionalGetMessageInspector : IDispatchMessageInspector
{
private enum GetState { Modified, Unmodified }
private string ETag {
get { return XmlDataLoader.LastUpdatedTicks.ToString(); }
}
private DateTime LastModified {
get { return new DateTime(XmlDataLoader.LastUpdatedTicks);}
}
public object AfterReceiveRequest(ref Message request,
IClientChannel channel, InstanceContext instanceContext)
{
try
{
WebOperationContext.Current.IncomingRequest
.CheckConditionalRetrieve(ETag);
}
catch (WebFaultException)
{
instanceContext.Abort();
return GetState.Unmodified;
}
// No-op
return GetState.Modified;
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
if ((GetState)correlationState == GetState.Unmodified)
{
WebOperationContext.Current.OutgoingResponse.StatusCode =
HttpStatusCode.NotModified;
WebOperationContext.Current.OutgoingResponse.SuppressEntityBody =
true;
}
else
{
WebOperationContext.Current.OutgoingResponse.SetETag(ETag);
WebOperationContext.Current.OutgoingResponse.LastModified =
LastModified;
}
}
}