2011-06-03 1 views
1

私は読み取り専用のWCF RESTサービスを持っています(すべてGETの赤ちゃんです)。私はETag /条件付きサービスを私のサービスのすべての単一操作に追加したいと思います。 http://blogs.msdn.com/b/endpoint/archive/2010/02/25/conditional-get-and-etag-support-in-wcf-webhttp-services.aspxETagと条件付き取得をサポートするためにWCF WebHttp(REST)を拡張するにはどうすればよいですか?

私のサイトは、XMLファイルのカップルによって裏打ちされ、そしてそれらのいずれかが変更されたときに私のアプリを知っている(とイベントを発生させます):

は基本的に私は、この記事では技術の延長に興味があります。拡張点がどこにあるのか分かりません。パイプラインに接続して、毎回1​​つずつではなく、これらのヘッダーを追加するにはどうすればよいですか?

答えて

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; 
     } 
    } 
} 
0

これは、新しいWCF Web APIでのHttpOperationHandlerの機能です。http://wcf.codeplex.com WebHttpBindingで簡単に行うことができるかどうかわかりません。

関連する問題