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

发布于 2024-11-15 01:19:30 字数 610 浏览 1 评论 0原文

我有一个 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 flash 以外的任何内容,则无法处理消息正文,因此如果 supress_status_codes 为 true,我需要能够在 HttpResponseMessage 中返回带有错误和错误状态代码的“200”。

因此,Twitter 的 api 有一个相同的可选参数。

I have a WCF Web Api Restful webservice.

I want every single service call to take an optional parameters: suppress_status_codes. Is there a way to do this wihtout adding the parameter and handling to every end point like:

[WebGet(UriTemplate = "{somearg1}/{somearg2}/?supress={suppressStatusCodes}")
public HttpResponseMessage<string> SomeEndPoint(string somearg1, long somearg2, bool suppressStatusCodes)
{    
     // handle suppress status codes
     // do rest of call

The purpose of suppress_status_code is for Flash integration. If a webservice returns anything other than a 200 flash has an impossible timie processing the message body so I need to be able to return a "200" with an error and error status code in the HttpResponseMessage if supress_status_codes is true.

Twitter's api has an identical optional parameter for this reason.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

神经大条 2024-11-22 01:19:30

创建 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;
                });
    }
}

Creating a HttpOperationHandler would allow you to process the optional query parameter in a single place. However, if your Operation needs to know whether or not the SuppressStatusCodes has been set, then the easiest way to access it is via a parameter on the operation signature.

Depending on what you need to do, it may be possible to do all of the processing in your custom HttpOperationHandler. Can you describe the impact of SuppressStatusCodes on response?


Update:
This could actually be done at a higher layer using a HttpMessageHandler. You could check the url for the query param and change the status code directly. Here is a completely untested example of how it could be done:

    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;
                });
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文