﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-小菜毛毛技术分享-随笔分类-协议相关</title><link>http://www.blogjava.net/caizh2009/category/41741.html</link><description>与大家共同成长</description><language>zh-cn</language><lastBuildDate>Tue, 20 Apr 2010 05:26:10 GMT</lastBuildDate><pubDate>Tue, 20 Apr 2010 05:26:10 GMT</pubDate><ttl>60</ttl><item><title>MIME 类型大全</title><link>http://www.blogjava.net/caizh2009/archive/2010/04/15/318390.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Thu, 15 Apr 2010 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/04/15/318390.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/318390.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/04/15/318390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/318390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/318390.html</trackback:ping><description><![CDATA[<p><span style="color: red;">获取
ＭＩＭＥ：HttpContext.Current.Request.Files[fileKey].ContentLength</span></p>
<p><font size="2"><strong>MIME类型</strong><font color="#000000">就是设定某种扩展名
的文件用一种应用程序来打开的方式类型，当该扩展名文件被访问的时候，浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名，以及一些媒体文件打开方式。</font></font></p>
<p><font size="2" color="#000000">下面列出常用的文件对应的MIME类型：</font></p>
<table border="0" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <th align="left" bgcolor="#eeeeee"><font size="2">Mime-
            Types(mime类型)</font></th>
            <th align="left" bgcolor="#eeeeee"><font size="2">Dateiendung(扩
            展名)</font></th>
            <th align="left" bgcolor="#eeeeee"><font size="2">Bedeutung</font></th>
        </tr>
        <tr>
            <td><font size="2">application/msexcel</font></td>
            <td><font size="2">*.xls *.xla</font></td>
            <td><font size="2">Microsoft Excel Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">application/mshelp</font></td>
            <td><font size="2">*.hlp *.chm</font></td>
            <td><font size="2">Microsoft Windows Hilfe Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">application/mspowerpoint</font></td>
            <td><font size="2">*.ppt *.ppz *.pps *.pot</font></td>
            <td><font size="2">Microsoft Powerpoint Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">application/msword</font></td>
            <td><font size="2">*.doc *.dot</font></td>
            <td><font size="2">Microsoft Word Dateien</font></td>
        </tr>
        <tr>
            <td>
            <p>application/octet-stream</p>
            </td>
            <td>*.exe</td>
            <td>exe</td>
        </tr>
        <tr>
            <td><font size="2">application/pdf</font></td>
            <td><font size="2">*.pdf</font></td>
            <td><font size="2">Adobe PDF-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">application/post******</font></td>
            <td><font size="2">*.ai *.eps *.ps</font></td>
            <td><font size="2">Adobe Post******-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">application/rtf</font></td>
            <td><font size="2">*.rtf</font></td>
            <td><font size="2">Microsoft RTF-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">application/x-httpd-php</font></td>
            <td><font size="2">*.php *.phtml</font></td>
            <td><font size="2">PHP-Dateien</font></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
<table border="0" cellpadding="3" cellspacing="1">
    <tbody>
        <tr>
            <td><font size="2">application/x-java******</font></td>
            <td><font size="2">*.js</font></td>
            <td><font size="2">serverseitige Java******-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">application/x-shockwave-flash</font></td>
            <td><font size="2">*.swf *.cab</font></td>
            <td><font size="2">Flash Shockwave-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">application/zip</font></td>
            <td><font size="2">*.zip</font></td>
            <td><font size="2">ZIP-Archivdateien</font></td>
        </tr>
        <tr>
            <td><font size="2">audio/basic</font></td>
            <td><font size="2">*.au *.snd</font></td>
            <td><font size="2">Sound-Dateien</font></td>
        </tr>
        <tr>
            <td>audio/mpeg</td>
            <td>*.mp3</td>
            <td><font size="2">MPEG-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">audio/x-midi</font></td>
            <td><font size="2">*.mid *.midi</font></td>
            <td><font size="2">MIDI-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">audio/x-mpeg</font></td>
            <td><font size="2">*.mp2</font></td>
            <td><font size="2">MPEG-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">audio/x-wav</font></td>
            <td><font size="2">*.wav</font></td>
            <td><font size="2">Wav-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">image/gif</font></td>
            <td><font size="2">*.gif</font></td>
            <td><font size="2">GIF-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">image/jpeg</font></td>
            <td><font size="2">*.jpeg *.jpg *.jpe</font></td>
            <td><font size="2">JPEG-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">image/x-windowdump</font></td>
            <td><font size="2">*.xwd</font></td>
            <td><font size="2">X-Windows Dump</font></td>
        </tr>
        <tr>
            <td><font size="2">text/css</font></td>
            <td><font size="2">*.css</font></td>
            <td><font size="2">CSS Stylesheet-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">text/html</font></td>
            <td><font size="2">*.htm *.html *.shtml</font></td>
            <td><font size="2">-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">text/java******</font></td>
            <td><font size="2">*.js</font></td>
            <td><font size="2">Java******-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">text/plain</font></td>
            <td><font size="2">*.txt</font></td>
            <td><font size="2">reine Textdateien</font></td>
        </tr>
        <tr>
            <td><font size="2">video/mpeg</font></td>
            <td><font size="2">*.mpeg *.mpg *.mpe</font></td>
            <td><font size="2">MPEG-Dateien</font></td>
        </tr>
        <tr>
            <td>video/vnd.rn-realvideo</td>
            <td>*.rmvb</td>
            <td>realplay-Dateien</td>
        </tr>
        <tr>
            <td><font size="2">video/quicktime</font></td>
            <td><font size="2">*.qt *.mov</font></td>
            <td><font size="2">Quicktime-Dateien</font></td>
        </tr>
        <tr>
            <td><font size="2">video/vnd.vivo</font></td>
            <td><font size="2">*viv *.vivo</font></td>
            <td><font size="2">Vivo-Dateien</font></td>
        </tr>
    </tbody>
</table>
<p>更多....查找请用ctrl+F</p>
<p><font face="Verdana">MIME类型大全<br />
application/vnd.lotus-1-2-3<br />
3gp video/3gpp<br />
aab application/x-authoware-bin<br />
aam application/x-authoware-map<br />
aas application/x-authoware-seg<br />
ai application/post******<br />
aif audio/x-aiff<br />
aifc audio/x-aiff<br />
aiff audio/x-aiff<br />
als audio/X-Alpha5<br />
amc application/x-mpeg<br />
ani application/octet-stream<br />
asc text/plain<br />
asd application/astound<br />
asf video/x-ms-asf<br />
asn application/astound<br />
asp application/x-asap<br />
asx video/x-ms-asf<br />
au audio/basic<br />
avb application/octet-stream<br />
avi video/x-msvideo<br />
awb audio/amr-wb<br />
bcpio application/x-bcpio<br />
bin application/octet-stream<br />
bld application/bld<br />
bld2 application/bld2<br />
bmp application/x-MS-bmp<br />
bpk application/octet-stream<br />
bz2 application/x-bzip2<br />
cal image/x-cals<br />
ccn application/x-cnc<br />
cco application/x-cocoa<br />
cdf application/x-netcdf<br />
cgi magnus-internal/cgi<br />
chat application/x-chat<br />
class application/octet-stream<br />
clp application/x-msclip<br />
cmx application/x-cmx<br />
co application/x-cult3d-object<br />
cod image/cis-cod<br />
cpio application/x-cpio<br />
cpt application/mac-compactpro<br />
crd application/x-mscardfile<br />
csh application/x-csh<br />
csm chemical/x-csml<br />
csml chemical/x-csml<br />
css text/css<br />
cur application/octet-stream<br />
dcm x-lml/x-evm<br />
dcr application/x-director<br />
dcx image/x-dcx<br />
dhtml text/html<br />
dir application/x-director<br />
dll application/octet-stream<br />
dmg application/octet-stream<br />
dms application/octet-stream<br />
doc application/msword<br />
dot application/x-dot<br />
dvi application/x-dvi<br />
dwf drawing/x-dwf<br />
dwg application/x-autocad<br />
dxf application/x-autocad<br />
dxr application/x-director<br />
ebk application/x-expandedbook<br />
emb chemical/x-embl-dl-nucleotide<br />
embl chemical/x-embl-dl-nucleotide<br />
eps application/post******<br />
eri image/x-eri<br />
es audio/echospeech<br />
esl audio/echospeech<br />
etc application/x-earthtime<br />
etx text/x-setext<br />
evm x-lml/x-evm<br />
evy application/x-envoy<br />
exe application/octet-stream<br />
fh4 image/x-freehand<br />
fh5 image/x-freehand<br />
fhc image/x-freehand<br />
fif image/fif<br />
fm application/x-maker<br />
fpx image/x-fpx<br />
fvi video/isivideo<br />
gau chemical/x-gaussian-input<br />
gca application/x-gca-compressed<br />
gdb x-lml/x-gdb<br />
gif image/gif<br />
gps application/x-gps<br />
gtar application/x-gtar<br />
gz application/x-gzip<br />
hdf application/x-hdf<br />
hdm text/x-hdml<br />
hdml text/x-hdml<br />
hlp application/winhlp<br />
hqx application/mac-binhex40<br />
htm text/html<br />
html text/html<br />
hts text/html<br />
ice x-conference/x-cooltalk<br />
ico application/octet-stream<br />
ief image/ief<br />
ifm image/gif<br />
ifs image/ifs<br />
imy audio/melody<br />
ins application/x-NET-Install<br />
ips application/x-ip******<br />
ipx application/x-ipix<br />
it audio/x-mod<br />
itz audio/x-mod<br />
ivr i-world/i-vrml<br />
j2k image/j2k<br />
jad text/vnd.sun.j2me.app-de******or<br />
jam application/x-jam<br />
jar application/java-archive<br />
jnlp application/x-java-jnlp-file<br />
jpe image/jpeg<br />
jpeg image/jpeg<br />
jpg image/jpeg<br />
jpz image/jpeg<br />
js application/x-java******<br />
jwc application/jwc<br />
kjx application/x-kjx<br />
lak x-lml/x-lak<br />
latex application/x-latex<br />
lcc application/fastman<br />
lcl application/x-digitalloca<br />
lcr application/x-digitalloca<br />
lgh application/lgh<br />
lha application/octet-stream<br />
lml x-lml/x-lml<br />
lmlpack x-lml/x-lmlpack<br />
lsf video/x-ms-asf<br />
lsx video/x-ms-asf<br />
lzh application/x-lzh<br />
m13 application/x-msmediaview<br />
m14 application/x-msmediaview<br />
m15 audio/x-mod<br />
m3u audio/x-mpegurl<br />
m3url audio/x-mpegurl<br />
ma1 audio/ma1<br />
ma2 audio/ma2<br />
ma3 audio/ma3<br />
ma5 audio/ma5<br />
man application/x-troff-man<br />
map magnus-internal/imagemap<br />
mbd application/mbedlet<br />
mct application/x-mascot<br />
mdb application/x-msaccess<br />
mdz audio/x-mod<br />
me application/x-troff-me<br />
mel text/x-vmel<br />
mi application/x-mif<br />
mid audio/midi<br />
midi audio/midi<br />
mif application/x-mif<br />
mil image/x-cals<br />
mio audio/x-mio<br />
mmf application/x-skt-lbs<br />
mng video/x-mng<br />
mny application/x-msmoney<br />
moc application/x-mocha<br />
mocha application/x-mocha<br />
mod audio/x-mod<br />
mof application/x-yumekara<br />
mol chemical/x-mdl-molfile<br />
mop chemical/x-mopac-input<br />
mov video/quicktime<br />
movie video/x-sgi-movie<br />
mp2 audio/x-mpeg<br />
mp3 audio/x-mpeg<br />
mp4 video/mp4<br />
mpc application/vnd.mpohun.certificate<br />
mpe video/mpeg<br />
mpeg video/mpeg<br />
mpg video/mpeg<br />
mpg4 video/mp4<br />
mpga audio/mpeg<br />
mpn application/vnd.mophun.application<br />
mpp application/vnd.ms-project<br />
mps application/x-mapserver<br />
mrl text/x-mrml<br />
mrm application/x-mrm<br />
ms application/x-troff-ms<br />
mts application/metastream<br />
mtx application/metastream<br />
mtz application/metastream<br />
mzv application/metastream<br />
nar application/zip<br />
nbmp image/nbmp<br />
nc application/x-netcdf<br />
ndb x-lml/x-ndb<br />
ndwn application/ndwn<br />
nif application/x-nif<br />
nmz application/x-scream<br />
nokia-op-logo image/vnd.nok-oplogo-color<br />
npx application/x-netfpx<br />
nsnd audio/nsnd<br />
nva application/x-neva1<br />
oda application/oda<br />
oom application/x-AtlasMate-Plugin<br />
pac audio/x-pac<br />
pae audio/x-epac<br />
pan application/x-pan<br />
pbm image/x-portable-bitmap<br />
pcx image/x-pcx<br />
pda image/x-pda<br />
pdb chemical/x-pdb<br />
pdf application/pdf<br />
pfr application/font-tdpfr<br />
pgm image/x-portable-graymap<br />
pict image/x-pict<br />
pm application/x-perl<br />
pmd application/x-pmd<br />
png image/png<br />
pnm image/x-portable-anymap<br />
pnz image/png<br />
pot application/vnd.ms-powerpoint<br />
ppm image/x-portable-pixmap<br />
pps application/vnd.ms-powerpoint<br />
ppt application/vnd.ms-powerpoint<br />
pqf application/x-cprplayer<br />
pqi application/cprplayer<br />
prc application/x-prc<br />
proxy application/x-ns-proxy-autoconfig<br />
ps application/post******<br />
ptlk application/listenup<br />
pub application/x-mspublisher<br />
pvx video/x-pv-pvx<br />
qcp audio/vnd.qcelp<br />
qt video/quicktime<br />
qti image/x-quicktime<br />
qtif image/x-quicktime<br />
r3t text/vnd.rn-realtext3d<br />
ra audio/x-pn-realaudio<br />
ram audio/x-pn-realaudio<br />
rar application/x-rar-compressed<br />
ras image/x-cmu-raster<br />
rdf application/rdf+xml<br />
rf image/vnd.rn-realflash<br />
rgb image/x-rgb<br />
rlf application/x-richlink<br />
rm audio/x-pn-realaudio<br />
rmf audio/x-rmf<br />
rmm audio/x-pn-realaudio<br />
rmvb audio/x-pn-realaudio<br />
rnx application/vnd.rn-realplayer<br />
roff application/x-troff<br />
rp image/vnd.rn-realpix<br />
rpm audio/x-pn-realaudio-plugin<br />
rt text/vnd.rn-realtext<br />
rte x-lml/x-gps<br />
rtf application/rtf<br />
rtg application/metastream<br />
rtx text/richtext<br />
rv video/vnd.rn-realvideo<br />
rwc application/x-rogerwilco<br />
s3m audio/x-mod<br />
s3z audio/x-mod<br />
sca application/x-supercard<br />
scd application/x-msschedule<br />
sdf application/e-score<br />
sea application/x-stuffit<br />
sgm text/x-sgml<br />
sgml text/x-sgml<br />
sh application/x-sh<br />
shar application/x-shar<br />
shtml magnus-internal/parsed-html<br />
shw application/presentations<br />
si6 image/si6<br />
si7 image/vnd.stiwap.sis<br />
si9 image/vnd.lgtwap.sis<br />
sis application/vnd.symbian.install<br />
sit application/x-stuffit<br />
skd application/x-Koan<br />
skm application/x-Koan<br />
skp application/x-Koan<br />
skt application/x-Koan<br />
slc application/x-salsa<br />
smd audio/x-smd<br />
smi application/smil<br />
smil application/smil<br />
smp application/studiom<br />
smz audio/x-smd<br />
snd audio/basic<br />
spc text/x-speech<br />
spl application/futuresplash<br />
spr application/x-sprite<br />
sprite application/x-sprite<br />
spt application/x-spt<br />
src application/x-wais-source<br />
stk application/hyperstudio<br />
stm audio/x-mod<br />
sv4cpio application/x-sv4cpio<br />
sv4crc application/x-sv4crc<br />
svf image/vnd<br />
svg image/svg-xml<br />
svh image/svh<br />
svr x-world/x-svr<br />
swf application/x-shockwave-flash<br />
swfl application/x-shockwave-flash<br />
t application/x-troff<br />
tad application/octet-stream<br />
talk text/x-speech<br />
tar application/x-tar<br />
taz application/x-tar<br />
tbp application/x-timbuktu<br />
tbt application/x-timbuktu<br />
tcl application/x-tcl<br />
tex application/x-tex<br />
texi application/x-texinfo<br />
texinfo application/x-texinfo<br />
tgz application/x-tar<br />
thm application/vnd.eri.thm<br />
tif image/tiff<br />
tiff image/tiff<br />
tki application/x-tkined<br />
tkined application/x-tkined<br />
toc application/toc<br />
toy image/toy<br />
tr application/x-troff<br />
trk x-lml/x-gps<br />
trm application/x-msterminal<br />
tsi audio/tsplayer<br />
tsp application/dsptype<br />
tsv text/tab-separated-values<br />
tsv text/tab-separated-values<br />
ttf application/octet-stream<br />
ttz application/t-time<br />
txt text/plain<br />
ult audio/x-mod<br />
ustar application/x-ustar<br />
uu application/x-uuencode<br />
uue application/x-uuencode<br />
vcd application/x-cdlink<br />
vcf text/x-vcard<br />
vdo video/vdo<br />
vib audio/vib<br />
viv video/vivo<br />
vivo video/vivo<br />
vmd application/vocaltec-media-desc<br />
vmf application/vocaltec-media-file<br />
vmi application/x-dreamcast-vms-info<br />
vms application/x-dreamcast-vms<br />
vox audio/voxware<br />
vqe audio/x-twinvq-plugin<br />
vqf audio/x-twinvq<br />
vql audio/x-twinvq<br />
vre x-world/x-vream<br />
vrml x-world/x-vrml<br />
vrt x-world/x-vrt<br />
vrw x-world/x-vream<br />
vts workbook/formulaone<br />
wav audio/x-wav<br />
wax audio/x-ms-wax<br />
wbmp image/vnd.wap.wbmp<br />
web application/vnd.xara<br />
wi image/wavelet<br />
wis application/x-InstallShield<br />
wm video/x-ms-wm<br />
wma audio/x-ms-wma<br />
wmd application/x-ms-wmd<br />
wmf application/x-msmetafile<br />
wml text/vnd.wap.wml<br />
wmlc application/vnd.wap.wmlc<br />
wmls text/vnd.wap.wml******<br />
wmlsc application/vnd.wap.wml******c<br />
wml****** text/vnd.wap.wml******<br />
wmv audio/x-ms-wmv<br />
wmx video/x-ms-wmx<br />
wmz application/x-ms-wmz<br />
wpng image/x-up-wpng<br />
wpt x-lml/x-gps<br />
wri application/x-mswrite<br />
wrl x-world/x-vrml<br />
wrz x-world/x-vrml<br />
ws text/vnd.wap.wml******<br />
wsc application/vnd.wap.wml******c<br />
wv video/wavelet<br />
wvx video/x-ms-wvx<br />
wxl application/x-wxl<br />
x-gzip application/x-gzip<br />
xar application/vnd.xara<br />
xbm image/x-xbitmap<br />
xdm application/x-xdma<br />
xdma application/x-xdma<br />
xdw application/vnd.fujixerox.docuworks<br />
xht application/xhtml+xml<br />
xhtm application/xhtml+xml<br />
xhtml application/xhtml+xml<br />
xla application/vnd.ms-excel<br />
xlc application/vnd.ms-excel<br />
xll application/x-excel<br />
xlm application/vnd.ms-excel<br />
xls application/vnd.ms-excel<br />
xlt application/vnd.ms-excel<br />
xlw application/vnd.ms-excel<br />
xm audio/x-mod<br />
xml text/xml<br />
xmz audio/x-mod<br />
xpi application/x-xpinstall<br />
xpm image/x-xpixmap<br />
xsit text/xml<br />
xsl text/xml<br />
xul text/xul<br />
xwd image/x-xwindowdump<br />
xyz chemical/x-pdb<br />
yz1 application/x-yz1<br />
z application/x-compress<br />
zac application/x-zaurus-zac<br />
zip application/zip</font></p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/318390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-04-15 10:59 <a href="http://www.blogjava.net/caizh2009/archive/2010/04/15/318390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Content-Disposition的使用和注意事项</title><link>http://www.blogjava.net/caizh2009/archive/2010/01/19/310133.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 19 Jan 2010 13:36:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/01/19/310133.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/310133.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/01/19/310133.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/310133.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/310133.html</trackback:ping><description><![CDATA[最近不少Web技术圈内的朋友在讨论协议方面的事情，有的说web开发者应该熟悉web相关的协议，有的则说不用很了解。个人认为这要分层次来看待这个问题，对于一个新手或者刚入门的web开发人员而言，研究协议方面的东西可能会使得web开发失去趣味性、抹煞学习积极性，这类人应该更多的了解基本的Web技术使用。而对于在该行业工作多年的老鸟来说，协议相关的内容、标准相关内容应该尽量多些的了解，因为只有这样才能使得经手的web系统更加优秀（安全、漂亮、快速、兼容性好、体验好&#8230;&#8230;）。本文我们来说一下MIME 协议的一个扩展<span class="searchword">Content-disposition</span>。
<p>&nbsp;&nbsp;&nbsp; 我们在开发web系统时有时会有以下需求：</p>
<ul>
    <li>希望某类或者某已知MIME 类型的文件（比如：*.gif;*.txt;*.htm）能够在访问时弹出&#8220;文件下载&#8221;对话框
    <li>希望以原始文件名（上传时的文件名,例如：山东省政府1024号文件.doc）提供下载，但服务器上保存的地址却是其他文件名（如：12519810948091234_asdf.doc)
    <li>希望某文件直接在浏览器上显示而不是弹出文件下载对话框
    <li>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 要解决上述需求就可以使用<span class="searchword">Content-disposition</span>来解决。第一个需求的解决办法是</p>
<div class="csharpcode">
<pre><span style="font-size: 11px; color: black; font-family: courier new; background-color: transparent">Response.AddHeader <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"<span class="searchword">content-disposition</span>"</span>,<span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"attachment; filename=fname.ext"</span></span></pre>
</div>
<div class="csharpcode">&nbsp;</div>
<div class="csharpcode">将上述需求进行归我给出如下例子代码：</div>
<div class="csharpcode">
<pre><span style="font-size: 11px; color: black; font-family: courier new; background-color: transparent"><span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">public</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">static</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">void</span> ToDownload(<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">string</span> serverfilpath,<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">string</span> filename)
{
FileStream fileStream <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">new</span> FileStream(serverfilpath, FileMode.Open);
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">long</span> fileSize <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> fileStream.Length;
HttpContext.Current.Response.ContentType <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"application/octet-stream"</span>;
HttpContext.Current.Response.AddHeader(<span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"<span class="searchword">Content-Disposition</span>"</span>, <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"attachment; filename=\""</span> <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">+</span> UTF_FileName(filename) <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">+</span> <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"\";"</span>);
<span style="font-size: 11px; color: green; font-family: courier new; background-color: transparent">////attachment --- 作为附件下载</span>
<span style="font-size: 11px; color: green; font-family: courier new; background-color: transparent">////inline --- 在线打开</span>
HttpContext.Current.Response.AddHeader(<span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"Content-Length"</span>, fileSize.ToString());
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">byte</span>[] fileBuffer <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">new</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">byte</span>[fileSize];
fileStream.Read(fileBuffer, 0, (<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">int</span>)fileSize);
HttpContext.Current.Response.BinaryWrite(fileBuffer);
fileStream.Close();
HttpContext.Current.Response.End();
}
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">public</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">static</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">void</span> ToOpen(<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">string</span> serverfilpath, <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">string</span> filename)
{
FileStream fileStream <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">new</span> FileStream(serverfilpath, FileMode.Open);
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">long</span> fileSize <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> fileStream.Length;
HttpContext.Current.Response.ContentType <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"application/octet-stream"</span>;
HttpContext.Current.Response.AddHeader(<span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"<span class="searchword">Content-Disposition</span>"</span>, <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"inline; filename=\""</span> <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">+</span> UTF_FileName(filename) <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">+</span> <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"\";"</span>);
HttpContext.Current.Response.AddHeader(<span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"Content-Length"</span>, fileSize.ToString());
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">byte</span>[] fileBuffer <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">new</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">byte</span>[fileSize];
fileStream.Read(fileBuffer, 0, (<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">int</span>)fileSize);
HttpContext.Current.Response.BinaryWrite(fileBuffer);
fileStream.Close();
HttpContext.Current.Response.End();
}
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">private</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">static</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">string</span> UTF_FileName(<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">string</span> filename)
{
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">return</span> HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8);
}</span></pre>
</div>
<p>&nbsp;</p>
<p>简单的对上述代码做一下解析，ToDownload方法为将一个服务器上的文件（serverfilpath为服务器上的物理地址），以某文件名(filename)在浏览器上弹出&#8220;文件下载&#8221;对话框，而ToOpen是将服务器上的某文件以某文件名在浏览器中显示/打开的。注意其中我使用了UTF_FileName方法，该方法很简单，主要为了解决包含非英文/数字名称的问题，比如说文件名为&#8220;衣明志.doc&#8221;，使用该方法客户端就不会出现乱码了。</p>
<p>&nbsp;<strong>需要注意以下几个问题：</strong> </p>
<ol>
    <li><span class="searchword">Content-disposition</span>是MIME协议的扩展，由于多方面的安全性考虑没有被标准化，所以可能某些浏览器不支持，比如说IE4.01
    <li>我们可以使用程序来使用它，也可以在web服务器（比如IIS）上使用它，只需要在http header上做相应的设置即可</li>
</ol>
<p class="csharpcode">可参看以下几篇文档：</p>
<ul>
    <li class="csharpcode"><a href="http://www.qihangnet.com/ct.ashx?id=db65d50a-ba90-4229-a3a2-71b4f1b407b9&amp;url=http%3a%2f%2fsupport.microsoft.com%2fkb%2f260519" target="_blank">如何为已知的 MIME 类型激活&#8220;文件下载&#8221;对话框</a>
    <li class="csharpcode"><a href="http://www.qihangnet.com/ct.ashx?id=db65d50a-ba90-4229-a3a2-71b4f1b407b9&amp;url=http%3a%2f%2fwww.faqs.org%2frfcs%2frfc2183.html" target="_blank">Communicating Presentation Information in Internet Messages: The <span class="searchword">Content-Disposition</span> Header Field</a>
    <li class="csharpcode"><a href="http://www.qihangnet.com/ct.ashx?id=db65d50a-ba90-4229-a3a2-71b4f1b407b9&amp;url=http%3a%2f%2fwww.w3.org%2fProtocols%2frfc2616%2frfc2616.html" target="_blank">Hypertext Transfer Protocol -- HTTP/1.1</a></li>
</ul>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<img src ="http://www.blogjava.net/caizh2009/aggbug/310133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-19 21:36 <a href="http://www.blogjava.net/caizh2009/archive/2010/01/19/310133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅析HTTP协议 </title><link>http://www.blogjava.net/caizh2009/archive/2009/09/19/295656.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Sat, 19 Sep 2009 04:27:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2009/09/19/295656.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/295656.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2009/09/19/295656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/295656.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/295656.html</trackback:ping><description><![CDATA[<h1 align="left"><span style="font-family: 宋体">浅析</span>HTTP<span style="font-family: 宋体">协议</span></h1>
<p align="left">HTTP<span style="font-family: 宋体">协议是什么？</span></p>
<p align="left"><span style="font-family: 宋体">简单来说，就是一个基于应用层</span><span style="font-family: 宋体">的通信规范：双方要进行通信，大家都要遵守一个规范，这个规范就是</span>HTTP<span style="font-family: 宋体">协议。</span></p>
<p align="left">HTTP<span style="font-family: 宋体">协议能做什么？</span></p>
<p align="left"><span style="font-family: 宋体">很多人首先一定会想到：浏览网页。没错，浏览网页是</span>HTTP<span style="font-family: 宋体">的主要应用，但是这并不代表</span>HTTP<span style="font-family: 宋体">就只能应用于网页的浏览。</span>HTTP<span style="font-family: 宋体">是一种协议，只要通信的双方都遵守这个协议，</span>HTTP<span style="font-family: 宋体">就能有用武之地。比如咱们常用的</span>QQ<span style="font-family: 宋体">，迅雷这些软件，都会使用</span>HTTP<span style="font-family: 宋体">协议(还包括其他的协议)。</span></p>
<p align="left">HTTP<span style="font-family: 宋体">协议如何工作？</span></p>
<p align="left"><span style="font-family: 宋体">大家都知道一般的通信流程：首先客户端发送一个请求</span>(request)<span style="font-family: 宋体">给服务器，服务器在接收到这个请求后将生成一个响应</span>(response)<span style="font-family: 宋体">返回给客户端。</span></p>
<p align="left"><span style="font-family: 宋体">在这个通信的过程中</span>HTTP<span style="font-family: 宋体">协议在以下</span>4<span style="font-family: 宋体">个方面做了规定：</span></p>
<p style="margin-left: 21pt; text-indent: -21pt; text-align: left" align="left"><strong><span>1.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong>Request</strong><strong><span style="font-family: 宋体">和</span>Response</strong><strong><span style="font-family: 宋体">的格式</span></strong></p>
<p style="margin-left: 21pt" align="left">Request<span style="font-family: 宋体">格式：</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">HTTP</span><span style="font-size: 10pt; font-family: 宋体">请求行</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"> <br />
</span><span style="font-size: 10pt; font-family: 宋体">（请求）头</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"> <br />
</span><span style="font-size: 10pt; font-family: 宋体">空行</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"> <br />
</span><span style="font-size: 10pt; font-family: 宋体">可选的消息体</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"> <br />
<br />
</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; font-family: 宋体">注：请求行和标题必须以</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">&lt;CR&gt;&lt;LF&gt; </span><span style="font-size: 10pt; font-family: 宋体">作为结尾（也就是，回车然后换行）。空行内必须只有</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">&lt;CR&gt;&lt;LF&gt;</span><span style="font-size: 10pt; font-family: 宋体">而无其他空格。在</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">HTTP/1.1 </span><span style="font-size: 10pt; font-family: 宋体">协议中，所有的请求头，除</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">Host</span><span style="font-size: 10pt; font-family: 宋体">外，都是可选的。</span></p>
<p style="margin-left: 42pt" align="left">&nbsp;</p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; font-family: 宋体">实例：</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">GET / HTTP/1.1</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Host: gpcuster.cnblogs.com</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Accept-Language: en-us,en;q=0.5</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Accept-Encoding: gzip,deflate</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Keep-Alive: 300</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Connection: keep-alive</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">If-Modified-Since: Mon, 25 May 2009 03:19:18 GMT</span></p>
<p style="margin-left: 21pt" align="left"><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">Response</span><span style="font-size: 10pt; font-family: 宋体">格式：</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">HTTP</span><span style="font-size: 10pt; font-family: 宋体">状态行</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"> <br />
</span><span style="font-size: 10pt; font-family: 宋体">（应答）头</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"> <br />
</span><span style="font-size: 10pt; font-family: 宋体">空行</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"> <br />
</span><span style="font-size: 10pt; font-family: 宋体">可选的消息体</span></p>
<p style="margin-left: 42pt" align="left">&nbsp;</p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; font-family: 宋体">实例：</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">HTTP/1.1 200 OK</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Cache-Control: private, max-age=30</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Content-Type: text/html; charset=utf-8</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Content-Encoding: gzip</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Expires: Mon, 25 May 2009 03:20:33 GMT</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Last-Modified: Mon, 25 May 2009 03:20:03 GMT</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Vary: Accept-Encoding</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Server: Microsoft-IIS/7.0</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">X-AspNet-Version: 2.0.50727</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">X-Powered-By: ASP.NET</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Date: Mon, 25 May 2009 03:20:02 GMT</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">Content-Length: 12173</span></p>
<p style="margin-left: 42pt" align="left">&nbsp;</p>
<p style="margin-left: 42pt" align="left"><span style="font-size: 10pt; color: #943634; font-family: 'Tahoma','sans-serif'">&shy;</span><span style="font-size: 10pt; color: #943634; font-family: 宋体">消息体的内容（略）</span></p>
<p style="margin-left: 42pt" align="left">&nbsp;</p>
<p align="left"><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; font-family: 宋体">详细的信息请参考：</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"><a href="http://rfc.sunsite.dk/rfc/rfc2616.html">RFC 2616</a></span><span style="font-size: 10pt; font-family: 宋体">。</span></p>
<p align="left"><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; font-family: 宋体">关于</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">HTTP headers</span><span style="font-size: 10pt; font-family: 宋体">的简要介绍，请查看：</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"><a href="http://www.cs.tut.fi/~jkorpela/http.html">Quick reference to HTTP headers</a></span></p>
<p style="margin-left: 21pt; text-indent: -21pt; text-align: left" align="left"><strong><span>2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-family: 宋体">建立连接的方式</span></strong></p>
<p style="margin-left: 21pt" align="left">HTTP<span style="font-family: 宋体">支持</span>2<span style="font-family: 宋体">中建立连接的方式：非持久连接和持久连接</span>(HTTP1.1<span style="font-family: 宋体">默认的连接方式为持久连接</span>)<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 42pt; text-indent: -21pt; text-align: left" align="left"><span>1)<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">非持久连接</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-family: 宋体">让我们查看一下非持久连接情况下从服务器到客户传送一个Web页面的步骤。假设该贝面由1个基本HTML文件和10个JPEG图像构成，而且所有这些对象都存放在同一台服务器主机中。再假设该基本HTML文件的URL为：gpcuster.cnblogs.com/index.html。</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-family: 宋体">下面是具体步骡:</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-family: 宋体">1.HTTP</span><span style="font-family: 宋体">客户初始化一个与服务器主机</span><span style="font-family: 宋体">gpcuster.cnblogs.com</span><span style="font-family: 宋体">中的HTTP服务器的TCP连接。HTTP服务器使用默认端口号80监听来自HTTP客户的连接建立请求。</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-family: 宋体">2.HTTP</span><span style="font-family: 宋体">客户经由与TCP连接相关联的本地套接字发出—个HTTP请求消息。这个消息中包含路径名/somepath/index.html。</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-family: 宋体">3.HTTP</span><span style="font-family: 宋体">服务器经由与TCP连接相关联的本地套接字接收这个请求消息，再从服务器主机的内存或硬盘中取出对象/somepath/index.html，经由同一个套接字发出包含该对象的响应消息。</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-family: 宋体">4.HTTP</span><span style="font-family: 宋体">服务器告知TCP关闭这个TCP连接(不过TCP要到客户收到刚才这个响应消息之后才会真正终止这个连接)。</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-family: 宋体">5.HTTP</span><span style="font-family: 宋体">客户经由同一个套接字接收这个响应消息。TCP连接随后终止。该消息标明所封装的对象是一个HTML文件。客户从中取出这个文件，加以分析后发现其中有10个JPEG对象的引用。</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-family: 宋体">6.</span><span style="font-family: 宋体">给每一个引用到的JPEG对象重复步骡1-4。</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-family: 宋体">上述步骤之所以称为使用非持久连接，原因是每次服务器发出一个对象后，相应的TCP连接就被关闭，也就是说每个连接都没有持续到可用于传送其他对象。每个TCP连接只用于传输一个请求消息和一个响应消息。就上述例子而言，用户每请求一次那个web页面，就产生11个TCP连接。</span></p>
<p style="margin-left: 42pt; text-indent: -21pt; text-align: left" align="left"><span>2)<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">持久连接</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-family: 宋体">非持久连接有些缺点。首先，客户得为每个待请求的对象建立并维护一个新的连接。对于每个这样的连接，</span>TCP<span style="font-family: 宋体">得在客户端和服务器端分配</span>TCP<span style="font-family: 宋体">缓冲区，并维持</span>TCP<span style="font-family: 宋体">变量。对于有可能同时为来自数百个不同客户的请求提供服务的</span>web<span style="font-family: 宋体">服务器来说，这会严重增加其负担。其次，如前所述，每个对象都有</span>2<span style="font-family: 宋体">个</span>RTT<span style="font-family: 宋体">的响应延长——一个</span>RTT<span style="font-family: 宋体">用于建立</span>TCP<span style="font-family: 宋体">连接，另—个</span>RTT<span style="font-family: 宋体">用于请求和接收对象。最后，每个对象都遭受</span>TCP<span style="font-family: 宋体">缓启动，因为每个</span>TCP<span style="font-family: 宋体">连接都起始于缓启动阶段。不过并行</span>TCP<span style="font-family: 宋体">连接的使用能够部分减轻</span>RTT<span style="font-family: 宋体">延迟和缓启动延迟的影响。</span></p>
<p style="margin-left: 42pt" align="left"><span style="font-family: 宋体">在持久连接情况下，服务器在发出响应后让</span>TCP<span style="font-family: 宋体">连接继续打开着。同一对客户</span>/<span style="font-family: 宋体">服务器之间的后续请求和响应可以通过这个连接发送。整个</span>Web<span style="font-family: 宋体">页面</span>(<span style="font-family: 宋体">上例中为包含一个基本</span>HTMLL<span style="font-family: 宋体">文件和</span>10<span style="font-family: 宋体">个图像的页面</span>)<span style="font-family: 宋体">自不用说可以通过单个持久</span>TCP<span style="font-family: 宋体">连接发送</span>:<span style="font-family: 宋体">甚至存放在同一个服务器中的多个</span>web<span style="font-family: 宋体">页面也可以通过单个持久</span>TCP<span style="font-family: 宋体">连接发送。通常，</span>HTTP<span style="font-family: 宋体">服务器在某个连接闲置一段特定时间后关闭它，而这段时间通常是可以配置的。持久连接分为不带流水线</span>(without pipelining)<span style="font-family: 宋体">和带流水线</span>(with pipelining)<span style="font-family: 宋体">两个版本。如果是不带流水线的版本，那么客户只在收到前一个请求的响应后才发出新的请求。这种情况下，</span>web<span style="font-family: 宋体">页面所引用的每个对象</span>(<span style="font-family: 宋体">上例中的</span>10<span style="font-family: 宋体">个图像</span>)<span style="font-family: 宋体">都经历</span>1<span style="font-family: 宋体">个</span>RTT<span style="font-family: 宋体">的延迟，用于请求和接收该对象。与非持久连接</span>2<span style="font-family: 宋体">个</span>RTT<span style="font-family: 宋体">的延迟相比，不带流水线的持久连接已有所改善，不过带流水线的持久连接还能进一步降低响应延迟。不带流水线版本的另一个缺点是，服务器送出一个对象后开始等待下一个请求，而这个新请求却不能马上到达。这段时间服务器资源便闲置了。</span></p>
<p style="margin-left: 42pt" align="left">HTTP/1.1<span style="font-family: 宋体">的默认模式使用带流水线的持久连接。这种情况下，</span>HTTP<span style="font-family: 宋体">客户每碰到一个引用就立即发出一个请求，因而</span>HTTP<span style="font-family: 宋体">客户可以一个接一个紧挨着发出各个引用对象的请求。服务器收到这些请求后，也可以一个接一个紧挨着发出各个对象。如果所有的请求和响应都是紧挨着发送的，那么所有引用到的对象一共只经历</span>1<span style="font-family: 宋体">个</span>RTT<span style="font-family: 宋体">的延迟</span>(<span style="font-family: 宋体">而不是像不带流水线的版本那样，每个引用到的对象都各有</span>1<span style="font-family: 宋体">个</span>RTT<span style="font-family: 宋体">的延迟</span>)<span style="font-family: 宋体">。另外，带流水线的持久连接中服务器空等请求的时间比较少。与非持久连接相比，持久连接</span>(<span style="font-family: 宋体">不论是否带流水线</span>)<span style="font-family: 宋体">除降低了</span>1<span style="font-family: 宋体">个</span>RTT<span style="font-family: 宋体">的响应延迟外，缓启动延迟也比较小。其原因在于既然各个对象使用同一个</span>TCP<span style="font-family: 宋体">连接，服务器发出第一个对象后就不必再以一开始的缓慢速率发送后续对象。相反，服务器可以按照第一个对象发送完毕时的速率开始发送下一个对象。</span></p>
<p style="margin-left: 21pt; text-indent: -21pt; text-align: left" align="left"><strong><span>3.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-family: 宋体">缓存的机制</span></strong></p>
<p style="margin-left: 21pt" align="left">HTTP/1.1<span style="font-family: 宋体">中缓存的目的是为了在很多情况下减少发送请求，同时在许多情况下可以不需要发送完整响应。前者减少了网络回路的数量；</span>HTTP<span style="font-family: 宋体">利用一个&#8220;过期（</span>expiration<span style="font-family: 宋体">）&#8221;机制来为此目的。后者减少了网络应用的带宽；</span>HTTP<span style="font-family: 宋体">用&#8220;验证（</span>validation<span style="font-family: 宋体">）&#8221;机制来为此目的。</span></p>
<p style="margin-left: 21pt" align="left">HTTP<span style="font-family: 宋体">定义了</span>3<span style="font-family: 宋体">种缓存机制：</span></p>
<p style="margin-left: 42pt; text-indent: -21pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: wingdings">l </span><strong><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">Freshness</span></strong><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"> allows a response to be used without re-checking it on the origin server, and can be controlled by both the server and the client. For example, the Expires response header gives a date when the document becomes stale, and the Cache-Control: max-age directive tells the cache how many seconds the response is fresh for.</span></p>
<p style="margin-left: 42pt; text-indent: -21pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: wingdings">l </span><strong><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">Validation</span></strong><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"> can be used to check whether a cached response is still good after it becomes stale. For example, if the response has a Last-Modified header, a cache can make a <em><span style="font-style: normal; font-family: 'Tahoma','sans-serif'">conditional request</span></em><em> </em>using the If-Modified-Since header to see if it has changed.</span></p>
<p style="margin-left: 42pt; text-indent: -21pt; text-align: left" align="left"><span style="font-family: wingdings">l </span><strong><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">Invalidation</span></strong><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"> is usually a side effect of another request that passes through the cache. For example, if URL associated with a cached response subsequently gets a POST, PUT or DELETE request, the cached response will be invalidated.</span></p>
<p style="margin-left: 21pt" align="left"><span style="font-family: 宋体">关于</span>web<span style="font-family: 宋体">缓存方面的内容可以参考：</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'">Caching Tutorial for Web Authors and Webmasters</span><span style="font-size: 10pt; font-family: 宋体">（</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"><a href="http://www.mnot.net/cache_docs" target="_blank"><span style="font-family: 宋体">英文版</span></a></span><span style="font-size: 10pt; font-family: 宋体">）（</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"><a href="http://www.chedong.com/tech/cache_docs.html" target="_blank"><span style="font-family: 宋体">中文版</span></a></span><span style="font-size: 10pt; font-family: 宋体">）</span></p>
<p style="margin-left: 21pt; text-indent: -21pt; text-align: left" align="left"><strong><span>4.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-family: 宋体">响应授权激发机制</span></strong></p>
<p style="margin-left: 21pt" align="left"><span style="font-family: 宋体">这些机制能被用于服务器激发客户端请求并且使客户端授权。</span></p>
<p style="margin-left: 21pt" align="left"><span style="font-family: 宋体">详细的信息请参考：</span><a href="http://www.ietf.org/rfc/rfc2617.txt">RFC 2617: HTTP Authentication: Basic and Digest Access</a></p>
<p><strong><span>5.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-family: 宋体">基于HTTP的应用</span></strong></p>
<p>1 HTTP代理</p>
<blockquote>
<p><a name="Topic161"></a>原理</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gpcuster/WindowsLiveWriter/HTTP_CC27/index_img3_2.gif"><img title="index_img3" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="99" alt="index_img3" src="http://images.cnblogs.com/cnblogs_com/gpcuster/WindowsLiveWriter/HTTP_CC27/index_img3_thumb.gif" width="244" border="0" /></a></p>
</blockquote>
<blockquote>
<p><a name="Topic163"></a>分类</p>
<ol>
    <li><a name="Topic164"></a>透明代理
    <li><a name="Topic165"></a>非透明代理
    <li><a name="Topic166"></a>反向代理 </li>
</ol>
<p><a href="http://images.cnblogs.com/cnblogs_com/gpcuster/WindowsLiveWriter/HTTP_CC27/index_img4_2.gif"><img title="index_img4" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="95" alt="index_img4" src="http://images.cnblogs.com/cnblogs_com/gpcuster/WindowsLiveWriter/HTTP_CC27/index_img4_thumb.gif" width="244" border="0" /></a></p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gpcuster/WindowsLiveWriter/HTTP_CC27/index_img5_2.gif"><img title="index_img5" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="209" alt="index_img5" src="http://images.cnblogs.com/cnblogs_com/gpcuster/WindowsLiveWriter/HTTP_CC27/index_img5_thumb.gif" width="244" border="0" /></a></p>
</blockquote>
<p><a name="Topic17"></a>2 多线程下载</p>
<ol>
    <ol>
        <li><a name="Topic169"></a>下载工具开启多个发出HTTP请求的线程
        <li><a name="Topic170"></a>每个http请求只请求资源文件的一部分：Content-Range: bytes 20000-40000/47000
        <li><a name="Topic171"></a>合并每个线程下载的文件 </li>
    </ol>
</ol>
<p>3 HTTPS传输协议原理</p>
<blockquote>
<p><a name="Topic172"></a>两种基本的加解密算法类型</p>
</blockquote>
<blockquote>
<p><a name="Topic173"></a>对称加密：密钥只有一个，加密解密为同一个密码，且加解密速度快，典型的对称加密算法有DES、AES等</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gpcuster/WindowsLiveWriter/HTTP_CC27/index_img6_2.gif"><img title="index_img6" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="112" alt="index_img6" src="http://images.cnblogs.com/cnblogs_com/gpcuster/WindowsLiveWriter/HTTP_CC27/index_img6_thumb.gif" width="244" border="0" /></a> <br />
</p>
<p><a name="Topic175"></a>非对称加密：密钥成对出现（且根据公钥无法推知私钥，根据私钥也无法推知公钥），加密解密使用不同密钥（公钥加密需要私钥解密，私钥加密需要公钥解密），相对对称加密速度较慢，典型的非对称加密算法有RSA、DSA等</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gpcuster/WindowsLiveWriter/HTTP_CC27/index_img7_2.gif"><img title="index_img7" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="192" alt="index_img7" src="http://images.cnblogs.com/cnblogs_com/gpcuster/WindowsLiveWriter/HTTP_CC27/index_img7_thumb.gif" width="244" border="0" /></a> <br />
</p>
</blockquote>
<blockquote>
<p><a name="Topic177"></a>HTTPS通信过程</p>
</blockquote>
<blockquote>
<p><a href="http://images.cnblogs.com/cnblogs_com/gpcuster/WindowsLiveWriter/HTTP_CC27/index_img8_2.gif"><img title="index_img8" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="index_img8" src="http://images.cnblogs.com/cnblogs_com/gpcuster/WindowsLiveWriter/HTTP_CC27/index_img8_thumb.gif" width="217" border="0" /></a> <br />
</p>
</blockquote>
<blockquote>
<p><a name="Topic179"></a>优点</p>
</blockquote>
<ol>
    <ol>
        <li><a name="Topic180"></a>客户端产生的密钥只有客户端和服务器端能得到
        <li><a name="Topic181"></a>加密的数据只有客户端和服务器端才能得到明文
        <li><a name="Topic182"></a>客户端到服务端的通信是安全的 </li>
    </ol>
</ol>
<p>&nbsp;</p>
<p>4 开发web程序时常用的Request Methods</p>
<blockquote>
<p><a name="Topic183"></a>HEAD</p>
<p><a name="Topic184"></a>（Head方法）要求响应与相应的GET请求的响应一样，但是没有的响应体（response body）。这用来获得响应头（response header）中的元数据信息（meta-infomation）有（很）帮助，（因为）它不需要传输所有的内容。</p>
<p><a name="Topic185"></a>TRACE</p>
<p><a name="Topic186"></a>（Trace方法告诉服务器端）返回收到的请求。客户端可以（通过此方法）察看在请求过程中中间服务器添加或者改变哪些内容。</p>
<p><a name="Topic187"></a>OPTIONS</p>
<p><a name="Topic188"></a>返回服务器（在指定URL上）支持的HTTP方法。通过请求&#8220;*&#8221;而不是指定的资源，这个方法可以用来检查网络服务器的功能。</p>
<p><a name="Topic189"></a>CONNECT</p>
<p><a name="Topic190"></a>将请求的连接转换成透明的TCP/IP通道，通常用来简化通过非加密的HTTP代理的SSL-加密通讯（HTTPS）。</p>
</blockquote>
<p><a name="Topic20"></a>5 用户与服务器的交互</p>
<ol>
    <ol>
        <li><a name="Topic191"></a>身份认证
        <li><a name="Topic192"></a>cookie
        <li><a name="Topic193"></a>带条件的GET </li>
    </ol>
</ol>
<p>6 基于Socket编程编写遵循HTTP的程序</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="left"><span style="font-family: 宋体">后记：</span></p>
<p align="left"><span style="font-family: 宋体">我<a href="http://www.cnblogs.com/gpcuster/archive/2009/05/25/1488749.html">这篇文章</a>只是对</span>HTTP<span style="font-family: 宋体">协议做了一个大概介绍，很多细节都有遗漏，</span><span style="font-family: 宋体">请有兴趣的朋友阅读</span><span style="font-size: 10pt; font-family: 'Tahoma','sans-serif'"><a href="http://rfc.sunsite.dk/rfc/rfc2616.html">RFC 2616</a>。</span></p>
<p>学习HTTP协议的好书：</p>
<p>1.O'Reilly - HTTP Pocket Reference：这是一本比较简短的介绍HTTP协议的书，可以作为入门读物</p>
<p>2.O'Reilly - HTTP The Definitive Guide：这是一本宝典级别的书，因为它包含的内容实在多，可以作为全面学习的HTTP协议的首选读物</p>
<p>3.Sams - HTTP Developers Handbook：这是比HTTP The Definitive Guide稍微比HTTP The Definitive Guide简单。不过从我的感觉，这本书比HTTP The Definitive Guide要好，因为它篇幅比较少，介绍的是HTTP精髓，我认为这本书应该是web程序员的首选读物</p>
<div id="div_digg"></div>
<img src ="http://www.blogjava.net/caizh2009/aggbug/295656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-09-19 12:27 <a href="http://www.blogjava.net/caizh2009/archive/2009/09/19/295656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>