【发布时间】:2011-12-14 04:40:37
【问题描述】:
我使用 Jetty7 作为 REST 服务器。通过处理 REST 请求,我支持来自 Win7 客户端的 webdav 连接。我的问题是这样的:
(1) 如果我双击一个文件,客户端会发送一个文件的 GET 请求。当在wireshark中捕获时,它显示请求来自客户端的54456端口到正在运行jetty的服务器端口80。
(2) 请求到达我的 REST 处理程序以获取 GET,然后我构建响应如下:
ResponseBuilder 构建器 = javax.ws.rs.core.Response.ok();
builder.header("Keep-Alive", "timeout=15, max=99");
builder.header("Connection", "Keep-Alive");
builder.header("Cache-Control", "no-store");
builder.header("接受范围", "字节");
builder.header("Last-Modified", new Rfc1123DateFormat().format(new Date(lastModified)));
builder.header("内容长度", fileLength);
InputStream in = new BufferedInputStream(in); //'in' 是 InputStream,我从其他模块获得并拥有文件 内容。
return builder.entity(in).build();
这里,'in' 是 BufferedInputStream,其中包含被询问的文件。
(3) 文件在客户端计算机上打开。但是在我的数据包跟踪中,响应标头不包含以下条目:Connection: Keep-Alive...Strange!!!
(4)然后我从客户端双击了一个文件夹。这向服务器发送了 PROPFIND 请求。该请求再次来自客户端的端口 54456。我还在服务器上放置了一个数据包捕获。服务器上的跟踪确认 PROPFIND 请求从端口号 54456 到达服务器......但我的处理程序从未被调用。最终,客户一直在等待和超时。之后,客户端再次尝试或显示找不到路径的错误。
(5) 但是如果 PROPFIND 请求来自任何其他端口(之前的 GET 请求来自该端口),则码头服务器会处理它并调用我的处理程序...
(6) 另一个观察:如果来自客户端的调用序列是这样的:第一个客户端从客户端的端口发送一个 PROPFIND,比如 54400,服务器响应。然后再次从同一个端口 PROPFIND,然后码头也处理它。但只有一个 GET 后跟一些其他请求导致码头没有响应。
我尝试在 Jetty.xml 文件中增加/减少 maxIdleTimeOut,但没有任何帮助。 我想知道是否可以让码头处理这些请求......通过我所在地区的一些代码更改或一些配置更改。或者如果你能看到我做的一些错误的编码......
谢谢, 阿尼尔。
【问题讨论】:
标签: http get jetty port webdav