我有一个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有一个相同的可选参数。答案 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;
});
}
}