(原)浅谈C# runat="server"(新手值得注意)
runat="server“顾名思义:在服务器端运行的意思。大家都知道,c#是执行在服务器端的,正因如此,有些问题就值得大家注意。
下面说说我的经验之谈:
一些日子做了一个web项目,其中有这样一个功能,我利用ActiveX控件对文字进行编辑,然后直接生成一个bmp的图。
在生成图的同时,需要直接将图上传到服务器上,也就是说不借助于任何控件,也不用用户去找那个生成的图。只要给出
生成文件的路径就可以。
.net利用控件上传文件自不必说,很简单的事情。但是让我头疼的是不利用控件实现文件的上传。在网上和朋友们讨论了一下,
多数人让我用文件流的方法来实现。查了下《c#高级编程》,很高兴的写了如下代码:
用vs2005运行了一下,实现了将文件C:\TEMP\aaaaa.txt上传到项目文件夹下。
但是当我真正的客户端服务器跨机测试的时候,问题就出现了:由于上面的代码是runat="server“的。而生成文件是在客户端
机器上的(假如是临时文件夹),也就是说会在服务器的临时文件夹下找生成的文件。自然就出错啦!哈哈,当弄明白后感觉自己
真的好可笑。
同样的,在《c#高级编程》中,讲到了这样一个类WebClient
WebClient类还提供了UploadFile()方法和UploadData()方法。UploadFile()方法用于把指定的文件上传到指定的位置,其中的文件名已经给出;而UploadData()方法用于把二进制数据上传至指定的URI,那些二进制数据是作为字节数组提供的(还有一个DownloadData()方法,用于从URI中检索字节数组):
其实也能给人带来同样的误解,新手很可能和我一样犯同样的错误!!经验之谈,忘大家注意!!
那解决上面问题的方法是什么呢?很简单啦,找个不再server执行的语言实现相应的功能就可以啦,不用说大家也知道
---javascript。具体的方法不介绍了,感兴趣的可以到网上找找,有时间我也写片文章介绍一下。
除了js,还有个方法:利用webclient类,这个类不是不能实现,只是微软没有说清楚,唯一的缺点就是得做成一个
ActiveX控件,将方法封装到ActiveX中,就能实现了。
有什么更好的见解大家交流。