WCF Web API如何将参数添加到每个端点

时间:2011-06-10 18:08:14

标签: c# .net wcf rest wcf-web-api

我有一个WCF Web Api Restful webservice。

我希望每个服务调用都采用可选参数: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集成。如果web服务返回除200闪存以外的任何内容,则处理消息正文时无法处理,因此如果supress_status_codes为真,我需要能够在HttpResponseMessage中返回带有错误和错误状态代码的“200”。

由于这个原因,Twitter的api有一个相同的可选参数。

1 个答案:

答案 0 :(得分: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;
                });
    }
}