服务器未能识别http标头SOAPAction的值
在一个.NET分布式应用程序的开发中,遇到了一个问题,困扰了我很久,今天终于 有了一些眉目.
问题是这样的,我用VS.NET 2003 创建了一个分布式应用程序,其中一个project是WebService,写了一些代码以后,经过测试,一切OK,于是信心大增,等完成了数据访问层和规则层等,已经是两个月以后的事了,经过初步考虑,决定对整个系统的输出文件名进行调整,以使程序集名称与namespace一致。
数据访问层的名空间为 XXX.Access 程序集名修改为XXX.Access.DLL
规则层的名空间为 XXX.Ruler,程序集名修改为XXX.Ruler.DLL
............................................................................................................
WebService的名空间为 XXX.Webs,默认的程序集名为Service.DLL,修改后为XXX.Webs.DLL
客户端程序的名空间为 XXX.WinUI 执行程序名为XXX.WinUI.exe。
XXX表示解决方案名称,一切调整完毕,在IDE中运行测试,还好,没什么问题。
于是继续实现其它功能,一日,在debug文件夹下双击运行XXX.WinUI.exe,调用一个WebService中的方法GetData时,问题来了,弹出了一个提示窗,内容是:“服务器未能识别http标头SOAPAction的值:http://tempuri.org/GetData”,当时不明白这其中的原因,于是在CSDN上发了求助贴,各式各样的回答都有,试了网友提供的一些方法,最终没能解决问题.
只好重新打开VS.NET重新编译运行,代码没有任何修改,在IDE中运行却是正常的,真有点糊涂了,以后总是关闭IDE后运行就不正常,打开IDE编译运行又正常。
今天又出了同样的问题,可恶的“服务器未能识别http标头SOAPAction的值”又弹出了, 真有点头大了,我打开了IE,地址栏中输入了
http://localhost/XXX/DataService.asmx ,敲回车,这一次我有了收获,
浏览器显示内容如下(灰色背景为浏览器输出.)
1行 DataService
2行 下列操作。有关正式定义,请查看服务说明。
3行 Web 服务使用 http://tempuri.org/ 作为它的默认命名空间。
(其余内容略,行号为本人所加)
正常情况下,2行到3行之间为方法列表,也就是函数名称,现在是空白的,怪不得客户端程序中调用时说不可识别的SOAPAction,原来服务器上就不存在这一方法GetData。
编译运行时完全正常,现在为何在服务器端就没有这些方法了呢?我百思不得其解,打开 单螺杆泵 http://localhost/XXX/所在的bin目录,发现了一些蛛丝马迹,在bin目录下好几个程序集,其中有两个是Service.DLL和XXX.Webs.DLL,前者是修改程序集名称之前的输出文件,后者是修改程序集名之后的输出文件,将Service.DLL移出bin目录,在浏览器地址栏中输入 http://localhost/XXX/DataService.asmx
这时候,IE显示的内容如下:
DataService
支持下列操作。有关正式定义,请查看服务说明。
UpdateData
AddData
GetData
此 Web 服务使用 http://tempuri.org/ 作为它的默认命名空间。
(余略)
这时候在debug目录下双击运行XXX.WinUI.exe,得到了和IDE中一样的结果。
原来,service.DLL和XXX.Webs.DLL中均存在名空间“XXX.Webs”以及同名的webService类,但是Service.DLL中不存在以后新增的方法,当客户请求这一方法时,服务器首先在Service.DLL程序集中查找到了名空间,找到名空间后在相应的服务类中查找方法,找到 单螺杆泵后执行,找不到则给客户反馈信息“服务器未能识别http标头SOAPAction”,为什么不首先在XXX.Webs.DLL中查找而是在service.DLL中查找呢?这可能与.NET(ver 1.1)优先查找有默认名称的程序集有关(有没有这一优先规则尚不确定,仅是猜测),也可能与程序集名称的字母排列顺序有关。
为什么在VS.NET的IDE中运行时又是正常的呢?我想是这样的,因为解决方案中指定了输出程序集的名称,这时候客户调用时仅在指定的程序集中查找名空间及方法,所以不会出现找不到函数名称的情况。
看来古人说的太太太对了, " 多一事不如少事",不修改程序集名称就没有这一档子事了.
注:VS2005(.NET 2.0)中如果有两个程序集中中包含了相同名的名空间及webService类,好象浏览器中会产生类型重复定义之类提示.具体情况网友可以验证
linux 看上去挺美,实际上还是有很多麻烦的地方,一个地方没弄好,你就得去查半天.
按我上次的经验,有了图形界面也不解决问题.
这次我是装了一个纯文本的 RHEL 5.
1, 服务的启动: service smb restart
2, 防火墙的设置: 运行 setup 将关于samba那一项,打开.
按照以上设置,可以看到目录了, 但仍不能访问,反复修复 smb.conf
甚至还从山东另一台 linux 上照搬,还是不行.再一查,原来是新版本的linux 多了一个叫
selinux 的东东,导致无法访问.
3, 关闭selinux 的方法
setenforce 0 #这是临时关闭,结果发现有效.也可永久关闭,但还可以不关闭.
4, rhel5中不关闭SeLinux配置SAMBA的方法
http://hlee.javaeye.com/blog/375355
#/usr/sbin/setsebool -P allow_smbd_anon_write=1
#chcon -t public_content_rw_t /share
5, 限制写入的文件类型,(这样病毒啥的就进不来了)
veto files = /*.exe/*.com/*.dll/*.rmvb/*.rm/*.mp3/*.vbs/
6, 限制每个目录的配额
不可以,但是你可以对文件系统做quota,指定这个文件夹所属的群组,从而对文件夹的大小进行限制,我就是这么做的。
http://bbs.chinaunix.net/viewthread.php?tid=785738
这个功能还没有试过,明天试试!
7, 性能问题.
开始传数据发现比较慢,比如一个110M的文件,传到2003要45秒,传到SAMBA要1分多钟,发现一个选项很管用,设置后传到SAMBA只要15秒,优于2003!
在[global]节添加:
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
http://fifi258.blog.163.com/blog/static/325827412008267417920/