0

我有一个 WCF Web Api Restful 网络服务。

我希望每个服务调用都采用可选参数: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 具有相同的可选参数。

4

1 回答 1

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;
                });
    }
}
于 2011-06-10T18:30:39.107 回答