1

私は読み取り専用の WCF REST サービスを持っています (すべてGETの赤ちゃん!) サービスのすべての操作に ETag/Conditional get サポートを追加したいと思います。

基本的に、この記事のテクニックを拡張することに興味があります: http://blogs.msdn.com/b/endpoint/archive/2010/02/25/conditional-get-and-etag-support-in-wcf-webhttp -services.aspx

私のサイトはいくつかの XML ファイルに支えられており、私のアプリはそれらのいずれかが変更されるとそれを認識します (そしてイベントを発生させます)。ただし、拡張ポイントがどこにあるのかわかりません。一度に 1 つずつではなく、呼び出しごとにこれらのヘッダーを追加するには、パイプラインにフックする方法を教えてください。

4

2 に答える 2

2

これはそれほど悪くないことが判明しました。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;
        }
    }
}
于 2011-06-06T23:06:40.813 に答える
0

それが、新しい WCF Web API http://wcf.codeplex.comの HttpOperationHandler の 目的です。WebHttpBinding で簡単に行う方法があるかどうかはわかりません。

于 2011-06-04T14:20:01.217 に答える