在一個.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/