
2008年6月18日
2002年冬天写的一首诗,今天翻箱子看见的,发表的博客上记录一下,当时上大学二年级,对网络还一窍不通。
审视
审视,世间这般纷杂,
审视,人心这般深沉,
难得的审视,心灵的独白,
一颗迷惑的心坎!
也不必踌躇,也不必评论,
更没有叹息,猜测和愤憎,
静静的,静静的仰望无垠的星辰,
静静的,静静的默许流逝的星雨。
嚼一芽橘黄,
滋润你粗糙的心,
尝一丝红椒,
燎起你似火的激情。
在这冰冷的冬季,
凝固你无绪的浪花,
永结向上的峰!
posted @
2008-06-18 18:50 caizhiyuan 阅读(115) |
评论 (1) |
编辑

2008年5月13日
五一前,接到项目经理的通知,把当前项目b/s结构改为c/s结构,让我尽快实现。说完之后我还和项目经理吵了一下。你说改就改,b/s到c/s以为是小孩玩泥巴呀,想捏成什么就捏成什么。最后不欢而散。节后,程序还是要改的,项目中很多要用到客户端机器的资源,c/s结构比较容易实现也没有权限的限制还稳定。
想了想其实让我改也挺好改的,转变个方式就是c/s结构了。以前做过一个小工具就是刚开始是一个网页,后来感觉在客户端直接装个软件比较好。
这个工具是 迷你天气预报http://www.skycn.com/soft/32059.html大家有兴趣可以下载使用,这个是06年做的。还经常有人我怎么实现的。我说你直接用Reflector看看代码不就是了。
整个项目有4个子系统是B/S结构,一个客户端小工具是数据采集和拨号传输。项目经理的意思是要把4个子系统都改成C/S结构和客户端工具集成载一起。你想想4个系统当时是8个人开发好几个月。现在让我一个人改成C/S结构。出了底层代码改得较少,可表现层的全部做吧。还要测试,看以前同事写的代码。还有N多报表。幸亏有以前的经验。整个项目的迁移我只用了2天就基本完成了,一些小毛病还需要调整的。其实就是做了一个浏览器。把B/S项目嵌入到C/S项目。
1.新建windows应用程序。
2.制作用户登陆窗口,调用webservices登陆的,登陆后得到一些配置信息,比如数据库连接字符串。这样在客户端软件里就可以不用配置和暴露数据库连接了以及其他敏感信息。
3.本来想偷懒直接把用户登陆后的界面嵌入,就万事大吉了。可是这样也太狠了吧。和原来没啥两样。
4.用户登陆成功后打开一个MainForm窗口,里面有菜单控件和工具栏控件,B/S项目是用Ext做前端展示的,每打开一个页面都在同窗体的tabpanel里,和ie7一样的风格。
winform里我选用了WeifenLuo.WinFormsUI.Docking,免费开源很好用。
5.新建一个窗体,里面放上WebBrowser控件,这个窗体的作用就是给这个窗体传一个url,里面打开这个网页。
6.有了数据库连接字符串,用户登陆后得到菜单然后动态生成menu,事件动态绑定。事件当然是打开一个窗体(步骤5),里面链接B/S结构里以前的网页.
其实到上面整个项目的迁移就基本完成了,可是这个过程有很多细节和注意的地方,
A.比如你winform用户登录的时候,用户登陆的session,cookies怎么在你的winform中生成。
B.网页中的javascript怎么调用winfrom的方法(不可能单单做一个浏览器吧),既然是C/S结构,一些B/S无法实现的功能,可以用Javascript调用Winform去完成。
首先先说说A,登陆我用的是winform的方式,这个登陆就算在调用webservice时在webservice中生成session可是客户端并没有在webbroswer中生成相应的session cookies。这样你在登陆成功后打开菜单连接时,打开的网页会提示用户没有登陆。
所以要在用户登陆的时候就要向WebBrowser中写session cookies。可是我到现在也不会写,我想写了也是伪造的。还不如让他在WebBrowser中在登陆一下:
//产生客户端session
string url = weburl + "Login.aspx?UserCode=" + this.txtBoxUsername.Text + "&Password=" + this.txtBoxPassword.Text + "&LangugeKind=" + GetLanguage();
new Creative.WebBrowser.MyWebBrowser().Navigate(url);
里面的Creative.WebBrowser.MyWebBrowser()是我把WebBrowser有封装了一下,实现了我的一些方法。
这样就可以在客户端的WebBrowser中产生登陆后的session了。(这个是在调用webservices登陆成功后在登陆的,所以用户名密码一定是对的)。其实登陆的时候可以直接用这个,然后得到webbrowser中的返回内容,来判断是否登录。可是我要从websevices中得到跟多的得东西,一些可能直接是对象。所以就没有直接用这个登陆判定,只是用其生成客户端session。
在说说B:
Javascript要和winform交互,首先winform要com口开放。com口开放一个是局部的某个form或者整个程序集开放。
单个form开放只需要在form类之上放上 [System.Runtime.InteropServices.ComVisible(true)]
[System.Runtime.InteropServices.ComVisible(true)]
public partial class BroswerForm : WeifenLuo.WinFormsUI.Docking.DockContent
要想使整个程序集都com口开放,可以再
项目属性-应用程序-程序集信息里选择com口开放。或者你可以直接在AssemblyInfo.cs里写上[assembly: ComVisible(true)]
com口开放了,javascript怎么和winform交互呢,或者winform怎么调用javascript中的方法呢。
设置 WebBrowser 的 ObjectForScripting 为一个对象,你可以设置为他本身,你也可以设置其他对象,当然我们设置当前的form最好了,比如我在form_load里设置了为当前form
private void BroswerForm_Load(object sender, EventArgs e)
{
this.myWebB.ObjectForScripting = this;
}
这样就好了,可以用当前WebBrowser 中网页的javascript访问这个form中的方法了。但这个方法必须是public的
比如我们在form里
public void test()
{
MessageBox.Show("ddddddddddddd");
}
在网页中就可以这样调用 window.external.test();
当然你还可以传参了和返回结果,这个大家可以自己试一下!
winform中的方法当然也可以访问网页中的javascript了包括变量和函数,使用WebBrowser 的Document属性来调用script的代码。
this.myWebB.Document.InvokeScript("ScriptName",Object[] ) 第一个参数是脚本的函数名 第二个是参数。
这样就可以实现双向互动了。
我就是这样把B/S结构转为C/S结构的,当然中间改了很多东西,很多网页不能实现的都转嫁给Winform实现了。这样项目保留了以前B/的,也实现了C/S的访问和使用方式。
感觉C/S里套用网页是很有意思的,很多布局比较复杂的或者报表都可以用网页实现,只要做的样式和C/S的一直就可以啦!
posted @
2008-05-13 11:32 caizhiyuan 阅读(133) |
评论 (2) |
编辑

2008年5月8日
今天早晨刚上班,调试winform程序,用户登陆一直超时,感到很郁闷,昨天下班前都好好的,今天就不行了。用户登陆是调用webservices验证的,用ie浏览webservices一看,也一直等待打不开,原来是iis坏了,查看iis一看果然默认网站是红色的err。点击启动报错,XXXX的错误不能启动,郁闷了。干脆卸载了,在重装。可是折腾完了还是不能启动。郁闷呀!百度一下。一看有很多关于iis不能启动的问题。看了几篇都是说打了WindowsXP-
KB939373补丁早晨iis不能,启动,卸载就好了。然后卸载,重启果然iis好了。重新注册了asp.net ,以为万事如意了,开始调试了一会程序。由于某个问题又重启了电脑。在调式程序,iis有挂了,怎么也起不来了,和第一次的一样的错误提示。郁闷啊,难道
KB939373没有卸载干净,可是在添加修改程序里没有呀,怒火中!!!!在百度一下,没有任何结果,都是说卸载
KB939373 补丁就好了,看了看iis关联的几个服务也都没问题。不知道怎么办了,最后有下载了KB939373 补丁安装后iis
不能启动,然后卸载还是不能启动。没办法呀,iis不能启动不能不干活呀,打开vs2005,改了一下网站的启动方式用vs内置的web服务器,发现vs内置的服务器就比iis默认网站多了个端口号,http://localhost:1324/Jyz 之类。iis不能用,难道是端口的问题,在打开iis,把默认网站的端口随便改了一个8000,在启动好了,晕,果然是端口的问题。再改成80端口,就不能启动了。
然后有打了KB939373的补丁也没问题。看来与KB939373补丁,没有关系,估计是那点把端口冲了,改改端口能用了。
posted @
2008-05-08 10:33 caizhiyuan 阅读(184) |
评论 (1) |
编辑

2008年5月5日
最近用Extjs做一些东西,json 用
Newtonsoft.Json做转换很好用。可是时间上出了一些问题,数据库里的时间和Grid里显示的时间差8小时。
刚开始以为是Ext的问题,把ext翻了个变也没弄出来。最后干脆把数据库的时间和.net读取的时间,用
Newtonsoft.Json序列化后的时间,最后再用
ext显示出来的时间作对比,才发现是
Newtonsoft.Json的问题,
Newtonsoft.Json转换DateTime整整快了8小时,也就是正好是我们的北京时区。
原因找到了,总算问题找出来了。
Newtonsoft.Json真好是开源的,在
Newtonsoft.Json源代码里查找“
new Date(” 找到时间转化,发现在
JavaScriptConvert.cs 里public static string ToString(DateTime value) 函数里 DateTime value减去当前的时区就可以了,
得到当前时区可以用 (DateTime.Now - DateTime.UtcNow).TotalHours
最后函数改为
public static string ToString(DateTime value)
{
long javaScriptTicks = ConvertDateTimeToJavaScriptTicks(value.AddHours(-(DateTime.Now - DateTime.UtcNow).TotalHours));
return "new Date(" + javaScriptTicks + ")";
}
重新编译,在试,好了
现在有很多用ext做表现层的,园子里用asp.net的也很多的把,推荐用Newtonsoft.Json做实体类集合到json的转换,很好用的。
posted @
2008-05-05 09:22 caizhiyuan 阅读(1373) |
评论 (9) |
编辑