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 文件支持,并且我的应用程序知道(并引发事件)其中任何一个文件发生更改。我不明白扩展点在哪里。如何连接到管道以为每次调用而不是一次添加这些标头?

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 回答