请教一个关于C#制作WEB SERVER,在传输大文件时控制socket的问题

鹿鸣sumice 2014-02-28 05:41:38
上传大时,IIS会将客户端的文件全部读取到自己的缓存下,然后再将请求传递给asp.net。
现在有这么一个需求,通过querystring或者cookie判断上传请求的权限,如果权限不够就拒绝上传,显然用IIS如果在权限不够的情况也会把文件全部接收完之后才能响应权限。

所以我自己开发一个解析HTTP报文的程序探究一下是否可以实现这样的需求,现在情况是:
我只取首行和head,然后判断权限,如果权限不通过,就不取body,这一步我在服务器端已经实现了
然后判断权限,权限i够就直接关掉socket,而且在关掉之前输出了正确的response,但是浏览器端就一直等待上传body,没有停止,也没有显示出接收的报文,特别是在传大文件(Buffer byte[]为10K)的时候,小文件比如1K的文件还是可以正确放弃传输,然后显示response,大文件就会一直等状传输,我已经关了socket(Socket.DisConnected(true);Socket.Close();),浏览器还是等待上传的状态

我的目标是如果没有权限,服务器端返回正确的response报文,然后关闭socket,并且浏览器端接收到response报文后正确显示,知道我关闭socket后停止传输

然后我试了试socket的shutdown(...Receive)方法,浏览器这回就没有等待,而是直接没有停止传输,我确定在shutdown之前已经输出了正确的response报文,但是也没有显示出来

请教大神,这是怎么回事?
...全文
187 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
鹿鸣sumice 2014-03-05
  • 打赏
  • 举报
回复
引用 12 楼 sbwwkmyd 的回复:
引用 11 楼 sumice 的回复:
10K就Socket的buffer,就是一次最多只读取10K的数据,上边的问题是指在大文件比如说200M的时候,就会出现文中开头的现象,这时候我只能用socket.shutdown()方法关闭流,但是在关闭之前我已经send了正确的响应报文,但是浏览器的现象是停止响应了,功能是实现了,但是不完美,完美的情况下浏览器应该是停止发送文件,然后正确接收response并显示出来
只能让浏览器端产生一个网络错误。如果非要客户端表面显示正常,可以使用iframe,监听onerror事件。
这样也是个可以解决的办法
showjim 2014-03-01
  • 打赏
  • 举报
回复
引用 8 楼 sumice 的回复:
看来只能这样子了
不管是web服务器,还是普通的TCP服务Socket.Shutdown都是必要的;而且就算执行了Socket.Shutdown,对方也可能出现无视的情况,最好是通过确定性的指令通知对方结束。
  • 打赏
  • 举报
回复
不要把误10k的文件当作“大文件”,这会产生幻觉。你应该用10M的文件来测试。 你的第一步(你自认为“已经实现了”的)其实就不能真正实现,后边的问题没有意义。
showjim 2014-03-01
  • 打赏
  • 举报
回复
引用 11 楼 sumice 的回复:
10K就Socket的buffer,就是一次最多只读取10K的数据,上边的问题是指在大文件比如说200M的时候,就会出现文中开头的现象,这时候我只能用socket.shutdown()方法关闭流,但是在关闭之前我已经send了正确的响应报文,但是浏览器的现象是停止响应了,功能是实现了,但是不完美,完美的情况下浏览器应该是停止发送文件,然后正确接收response并显示出来
只能让浏览器端产生一个网络错误。如果非要客户端表面显示正常,可以使用iframe,监听onerror事件。
鹿鸣sumice 2014-03-01
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
不要把误10k的文件当作“大文件”,这会产生幻觉。你应该用10M的文件来测试。 你的第一步(你自认为“已经实现了”的)其实就不能真正实现,后边的问题没有意义。
10K就Socket的buffer,就是一次最多只读取10K的数据,上边的问题是指在大文件比如说200M的时候,就会出现文中开头的现象,这时候我只能用socket.shutdown()方法关闭流,但是在关闭之前我已经send了正确的响应报文,但是浏览器的现象是停止响应了,功能是实现了,但是不完美,完美的情况下浏览器应该是停止发送文件,然后正确接收response并显示出来
鹿鸣sumice 2014-02-28
  • 打赏
  • 举报
回复
引用 5 楼 sbwwkmyd 的回复:
Socket.Shutdown(SocketShutdown.Both);
你不通知对方关闭,对方数据会没发送完,怎么会接收数据呢?当然客户端超时了,自然就会关掉了。
看来只能这样子了
鹿鸣sumice 2014-02-28
  • 打赏
  • 举报
回复
引用 4 楼 sbwwkmyd 的回复:
没碰到过这种浏览器,什么牌子的?
微软牌和谷歌牌都试过,都这样
showjim 2014-02-28
  • 打赏
  • 举报
回复
Socket.Shutdown(SocketShutdown.Both);
你不通知对方关闭,对方数据会没发送完,怎么会接收数据呢?当然客户端超时了,自然就会关掉了。
showjim 2014-02-28
  • 打赏
  • 举报
回复
没碰到过这种浏览器,什么牌子的?
鹿鸣sumice 2014-02-28
  • 打赏
  • 举报
回复
引用 2 楼 rtdb 的回复:
好厉害的样子 不过,一般在上传页面上先判断权限, 若无权限,就不必要显示上传按钮了。
探究一下技术实现,想搞清楚是怎么回事,而且用于WEB API的就没有上传按钮啦
rtdb 2014-02-28
  • 打赏
  • 举报
回复
好厉害的样子 不过,一般在上传页面上先判断权限, 若无权限,就不必要显示上传按钮了。

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧