2013-03-07 122 views
0

我在Mono/linux下遇到了一些HttpResponse.TransmitFile问题。此代码的工作:Mono HttpResponse.TransmitFile发送损坏的数据

using (var f = System.IO.File.Open(FileName, System.IO.FileMode.Open, FileAccess.Read)) 
{ 
    f.CopyTo(response.OutputStream); 
} 

在哪里,因为这不:虽然在这两种情况下我找回了一些数据(虽然它在Windows上)

response.TransmitFile(FileName); 

,所不同的是极端的。这里的数据的开始,因为它应该是:

8950 4e47 0d0a 1a0a 0000 000d 4948 4452 
0000 04b0 0000 00a0 0806 0000 001c b895 
4700 0000 0473 4249 5408 0808 087c 0864 
8800 0000 0970 4859 7300 001b af00 001b 
af01 5e1a 911c 0000 0019 7445 5874 536f 
6674 7761 7265 0077 7777 2e69 6e6b 7363 
6170 652e 6f72 679b ee3c 1a00 0020 0049 
4441 5478 9cec bd79 7454 c799 37fc bbbd 
492d b5f6 7d97 90d8 1108 3060 b3d8 98dd 
3660 6ce2 78c1 d8ce 624f 66be 64f2 bd99 
9ce4 cb99 c9c9 36f1 c439 4eec c964 9cc5 
9937 f19b 38c9 6499 378e 63c7 3678 5f00 
6302 189b cd6c 0281 d086 d46a f5be dcef 
0f51 5777 a9ba b76e 770b 845d bf73 38b4 
... (109270 bytes total) 

,但是这是我得到:

3161 6164 360d 0a89 504e 470d 0a1a 0a00 
0000 0d49 4844 5200 0004 b000 0000 a008 
0600 0000 1cb8 9547 0000 0004 7342 4954 
0808 0808 7c08 6488 0000 0009 7048 5973 
0000 1baf 0000 1baf 015e 1a91 1c00 0000 
1974 4558 7453 6f66 7477 6172 6500 7777 
772e 696e 6b73 6361 7065 2e6f 7267 9bee 
3c1a 0000 2000 4944 4154 789c ecbd 7974 
54c7 9937 fcbb bd49 2db5 f67d 9790 d811 
0830 60b3 d898 dd36 606c e278 c1d8 ce62 
4f66 be64 f2bd 999c e4cb 99c9 c936 f1c4 
394e ecc9 649c c599 37f1 9b38 c964 9937 
8e63 c736 785f 0063 0218 9bcd 6c02 81d0 
86d4 6af5 bedc ef0f 5157 77a9 bab7 6e77 
... (109286 bytes total) 

它看起来像某种编码问题的,但我难倒些什么呢可能是或如何解决它。

回答

2

它以3161 6164 360d 0a开头,这是一个十六进制数(0x1aad6109270,十进制,即文件大小),后跟一个CRLF。看起来像分块编码给我。

您的HTTP标题还应包含Transfer-Encoding: chunked

这不需要担心,服务器会得到正确的数据。

+0

啊,很好的发现。不知道你的意思是什么都不要担心,它应该是一个PNG文件,但它不会显示,因为它的头部嵌入了它的头部。 http标头确实具有分块编码集。上面的十六进制转储来自下载的文件。 – 2013-03-07 20:35:46

+0

你是如何下载文件的?服务器端似乎是正确的,但有可能无论你用什么来下载它都不理解分块编码。 – 2013-03-07 21:35:00

+0

Google Chrome。不,它确实与服务器相关 - 在Wireshark中查看它,该长度前缀本身是以长度为前缀的,从而使其成为内容数据的一部分。 – 2013-03-08 12:42:21