我有一个ApiController
通过 HTTP 的状态代码 307 重定向它来响应 POST 请求。它只使用来自标头的信息,因此此操作不需要请求的正文。此操作等效于:
public HttpResponseMessage Post() {
var url;
// Some logic to construct the URL
var response = new HttpResponseMessage(HttpStatusCode.TemporaryRedirect);
response.Headers.Location = new System.Uri(url);
return response;
}
这很简单,但我想做一个改进。请求正文可能包含大量数据,因此我想利用 HTTP 状态代码 100 来提高此请求的效率。使用现在的控制器,对话可能如下所示:
> POST /api/test HTTP/1.1
> Expect: 100-continue
> ...
< HTTP/1.1 100 Continue
> (request body is sent)
< HTTP/1.1 307 Temporary Redirect
< Location: (the URL)
< ...
由于重定向操作不需要请求正文,我希望能够将对话缩短为:
> POST /api/controller HTTP/1.1
> Expect: 100-continue
> ...
< HTTP/1.1 307 Temporary Redirect
< Location: (the URL)
< ...
我花了一天的大部分时间研究如何实现这一点,但我无法提出解决方案。在我的研究中,我了解到:
- 当
ApiController
' 的动作执行时,100 Continue
已经被发送。 - 当
ApiController
被构造时,100 Continue
已经被发送。 HttpApplication
触发'PreRequestHandlerExecute
事件时,100 Continue
尚未发送响应。- 当 a
DelegatingHandler
执行时,100 Continue
已经发送了。
基于此,到目前为止,我提出的最佳解决方案是创建一个HttpModule
使用RouteData
onRequestContext
来覆盖响应,当有ApiController
问题的是请求的接收者时。然而,这远不是一个理想的解决方案,因为几个原因(代码分离、没有利用 Web API 的参数绑定以及绕过AuthorizeAttribute
on the中的额外逻辑ApiController
)。
似乎必须有更好的解决方案,但我发现关于如何正确处理Expect: 100-continue
Web API 应用程序中的标头的信息很少。实现此ApiController
以正确处理Expect: 100-continue
标头的最简单方法是什么?