【问题标题】:ServiceStack HEAD request ContentLength not getting setServiceStack HEAD 请求 ContentLength 未设置
【发布时间】:2015-07-09 06:43:16
【问题描述】:

我正在使用带有单声道的 ServiceStack (4.0.31),并且我正在使用原始流,这意味着我的 DTO 是以下形式:

[FallbackRoute("/{Path*}")]
public class S3Request  : IRequiresRequestStream{ 
    public string Path{ get; set; }
    public Stream RequestStream { get; set; }
}

我实现了所有 HTTP 请求类型:GET、HEAD、POST、PUT、DELETE。我需要 HEAD 做出响应,正如 RFC 2616 中所定义的那样:

“HEAD 方法与 GET 相同,只是服务器不能在响应中返回消息体。响应 HEAD 请求的 HTTP 标头中包含的元信息应该与响应发送的信息相同GET 请求。”

这在 ServiceStack 中应该很简单,但根据我目前的理解,这已被证明是困难的。例如,如果我尝试以下操作,它几乎给了我想要的(对于 Head 请求响应):

Response.EndRequestWithNoContent();

但这不起作用,因为它将 Content-Length 标头字段清零,这与 RFC(和我的客户端)不一致。如果我不进行此调用,那么当我在设置 Content-Length 后返回 ServiceStack IResponse 时,我会在输出中获得默认 XML,这也与 RFC 不一致。此外,我无法装饰我的 DTO 或将路由设置为不返回 XML 的默认值,因为我必须将 IRequiresRequestStream 与公共路由一起使用。

我可以使用响应过滤器或其他方式告诉 ServiceStack 这是一个 HEAD 响应而不填写 XML,但也不删除我的 Content-Length?

【问题讨论】:

    标签: http servicestack


    【解决方案1】:

    您可以在不重置Content-Length 的情况下结束请求,只需:

    Response.EndRequest();
    

    【讨论】:

    • Response.EndRequest() 不起作用。我在设置 Content-Length 以及调用 Response.EndRequest(false) 之前和之后都尝试过。如果调用任何类型的 EndRequest(),ServiceStack 中有一些下游会覆盖并清除 Content-Length。我想知道是否可以在 EndRequest 之前发送或保留标头?关于解决方案的任何想法?
    • 这里是通过网络从 tcpflow 捕获的内容:127.000.000.001.01301-127.000.000.001.49146:HTTP/1.1 200 OK 服务器:OLS3 Server V1.0 日期:2015 年 7 月 9 日上午 10:41:54 上次修改时间:2015-06-25T21:56:28.726Z ETag:“565151bd2fb9f4ad4f48908e1471338a”x-amz-meta-cb-modified时间:2015 年 6 月 12 日星期五 18:16:20 GMT 变化:接受 X -Powered-By: ServiceStack/4.031 Unix/Mono Content-Type: application/octet-stream Content-Length: 0 Keep-Alive: timeout=15,max=100
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2011-12-11
    相关资源
    最近更新 更多