Как расширить WCF WebHttp (REST) ​​для поддержки ETag и условных геттов? - PullRequest
1 голос
/ 04 июня 2011

У меня есть служба 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, и мое приложение знает (и вызывает событие), когда любой из них изменяется. Я не понимаю, где находятся точки расширения. Как мне подключиться к конвейеру, чтобы добавить эти заголовки для каждого вызова, а не по одному?

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Это оказалось не так уж плохо.Я использовал 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 голосов
/ 04 июня 2011

Вот для чего нужен HttpOperationHandler в новом веб-API WCF http://wcf.codeplex.com Я не знаю, существует ли какой-либо простой способ сделать это с помощью WebHttpBinding.

...