C# WCF Web API如何向每个端点添加参数

C# WCF Web API如何向每个端点添加参数,c#,.net,wcf,rest,wcf-web-api,C#,.net,Wcf,Rest,Wcf Web Api,我有一个WCF Web Api Restful Web服务 我希望每个服务调用都采用可选参数:suppress\u status\u code。有没有一种方法不需要在每个端点添加参数和处理,如: [WebGet(UriTemplate = "{somearg1}/{somearg2}/?supress={suppressStatusCodes}") public HttpResponseMessage<string> SomeEndPoint(string somearg1, lon

我有一个WCF Web Api Restful Web服务

我希望每个服务调用都采用可选参数:suppress\u status\u code。有没有一种方法不需要在每个端点添加参数和处理,如:

[WebGet(UriTemplate = "{somearg1}/{somearg2}/?supress={suppressStatusCodes}")
public HttpResponseMessage<string> SomeEndPoint(string somearg1, long somearg2, bool suppressStatusCodes)
{    
     // handle suppress status codes
     // do rest of call
[WebGet(UriTemplate=“{somearg1}/{somearg2}/?suppress={suppressStatusCodes}”)
公共HttpResponseMessage SomeEndPoint(字符串somearg1、长somearg2、bool suppressStatusCodes)
{    
//句柄抑制状态代码
//做剩下的事
suppress_status_代码用于Flash集成。如果Web服务返回除200 Flash以外的任何内容,则无法对消息正文进行TIMI处理,因此如果suppress_status_代码为true,我需要能够在HttpResponseMessage中返回带有错误和错误状态代码的“200”


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

创建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;
                });
    }
}
公共类StatusKillerMessageHandler:DelegatingChannel{
公共状态KillerMessageHandler(HttpMessageChannel innerChannel)
:基本(内部通道){
}
受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken){
bool suppressStatusCode=(request.RequestUri.AbsoluteUri.ToLower().Contains(“suppress=true”);
返回base.sendaync(请求,取消令牌).ContinueWith(任务=>{
var response=task.Result;
if(抑制状态代码){
response.StatusCode=HttpStatusCode.OK;
}
返回响应;
});
}
}

谢谢,这让我走上了正确的道路,我已经将此模式用于我需要的其他一些东西。我有一个关于此操作的后续问题: