WCF Web API Как добавить аргумент в каждую конечную точку - PullRequest
0 голосов
/ 10 июня 2011

У меня есть веб-служба Restful Web Api WCF.

Я хочу, чтобы каждый вызов службы принимал необязательные параметры: suppress_status_codes.Есть ли способ сделать это без добавления параметра и обработки для каждой конечной точки, например:

[WebGet(UriTemplate = "{somearg1}/{somearg2}/?supress={suppressStatusCodes}")
public HttpResponseMessage<string> SomeEndPoint(string somearg1, long somearg2, bool suppressStatusCodes)
{    
     // handle suppress status codes
     // do rest of call

Цель suppress_status_code - для интеграции с Flash.Если веб-служба возвращает что-то кроме 200 флеш-памяти, то Тими не может обработать тело сообщения, поэтому мне нужно иметь возможность вернуть «200» с ошибкой и кодом состояния ошибки в HttpResponseMessage, если supress_status_codes имеет значение true.

По этой причине api в Twitter имеет идентичный необязательный параметр.

1 Ответ

1 голос
/ 10 июня 2011

Создание HttpOperationHandler позволит вам обработать необязательный параметр запроса в одном месте.Однако, если вашей Операции нужно знать, был ли установлен SuppressStatusCodes, то самый простой способ получить к нему доступ через параметр в сигнатуре операции.

В зависимости от того, что вам нужно сделать, это может бытьМожно выполнить всю обработку в вашем пользовательском HttpOperationHandler.Можете ли вы описать влияние SuppressStatusCodes на ответ?


Обновление: Это может быть сделано на более высоком уровне с использованием HttpMessageHandler.Вы можете проверить URL для параметра запроса и изменить код состояния напрямую.Вот совершенно непроверенный пример того, как это можно сделать:

    public class StatusKillerMessageHandler : DelegatingChannel {
    public StatusKillerMessageHandler(HttpMessageChannel innerChannel)
        : base(innerChannel) {
    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {

        bool suppressStatusCode = (request.RequestUri.AbsoluteUri.ToLower().Contains("suppress=true"));

        return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(task => {

                   var response = task.Result;
                   if (suppressStatusCode) {
                        response.StatusCode = HttpStatusCode.OK;
                   }
                   return response;
                });
    }
}
...