1

我将 java 的 HTTP Server 对象与 WebServiceProvider 实现的 Web 服务一起使用。我看到无论客户请求如何,答案都是分块的,我需要它具有内容长度。所以我假设问题出在服务器上,而不是网络服务器提供商,对吧?以及如何配置 http 标头以使用内容长度而不是分块?

    HttpServer m_server = HttpServer.create();
    Endpoint ep= Endpoint.create(new ep());
    HttpContext epContext = m_server.createContext("/DownloadFile");
    ep.publish(downloadFileContext);
4

1 回答 1

1

我假设您在谈论com.sun.net.httpserverHTTPServer。我进一步假设您Endpoint.publish使用一些支持 HTTPServer 的服务提供程序,通过调用将服务器连接到服务。

关键在于HttpExchange.sendResponseHeaders方法:

如果响应长度参数大于零,则指定要发送的确切字节数,并且应用程序必须发送该确切数据量。如果响应长度参数为零,则使用分块传输编码并且可以发送任意数量的数据。应用程序通过关闭 OutputStream 来终止响应正文。

因此,只要处理程序为 传递正值responseLength,就会使用 Content-Length。当然,要做到这一点,它必须提前知道要发送多少数据,而它很可能不会。恐怕它是否完全取决于绑定的实现。我不相信这是标准化的——事实上,我根本不相信 WebServiceProvider/HTTPServer 是标准化的。

但是,即使您的提供者不合作,您也有办法:编写一个添加缓冲的过滤器,并将其添加到您用于发布服务的 HttpContext 中。我认为要做到这一点,你必须编写一个HttpExchange的实现,它缓冲写入它的数据,将其传递到过滤器链中,以便处理程序写入其响应,然后当它返回时,写入缓冲的内容,设置responseLength何时这样做。

于 2011-08-02T20:26:45.527 回答