【问题标题】:WCF Web API How to Add Argument to Every EndpointWCF Web API 如何向每个端点添加参数
【发布时间】:2011-06-10 18:08:14
【问题描述】:

我有一个 WCF Web Api Restful web 服务。

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

【问题讨论】:

    标签: c# .net wcf rest wcf-web-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;
                    });
        }
    }
    

    【讨论】:

    • 谢谢,这让我走上了正确的道路,我已经将这种模式用于我需要的许多其他东西。我在这里对这个 OP 有一个后续问题:stackoverflow.com/questions/6313461/…
    猜你喜欢
    • 2023-02-14
    • 1970-01-01
    • 2018-07-28
    • 2015-01-03
    • 2019-06-16
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多