2011-06-10 31 views
0

我有一個WCF Web Api Restful web服務。WCF Web API如何向每個端點添加參數

我希望每一個服務調用都採用可選參數:suppress_status_codes。有沒有辦法做到這一點wihtout添加參數和處理每一個終點,如:

[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集成。如果一個web服務返回200閃存以外的任何東西都不可能處理郵件正文,所以如果supress_status_codes爲true,我需要能夠在HttpResponseMessage中返回一個帶有錯誤和錯誤狀態代碼的「200」。

由於這個原因,Twitter的API具有相同的可選參數。

回答

1

創建一個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; 
       }); 
    } 
} 
+0

用簡要描述更新了OP。 – 2011-06-10 18:34:13

+0

謝謝,這讓我走上了正確的軌道,並且我已經將這種模式用於我需要的其他一些東西。我在這裏有這個OP的後續問題:http://stackoverflow.com/questions/6313461/c-wcf-webapi-modify-responses-httpcontent – 2011-06-11 01:15:03