ISAPI 或 CGI 型式的 WebService, 如何取得客戶端的 IP ? |
答題得分者是:pcplayer99
|
boson
中階會員 ![]() ![]() ![]() 發表:74 回覆:155 積分:85 註冊:2004-07-31 發送簡訊給我 |
|
careychen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
|
boson
中階會員 ![]() ![]() ![]() 發表:74 回覆:155 積分:85 註冊:2004-07-31 發送簡訊給我 |
|
careychen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
好奇的問一下,您是用 Web Services -> SOAP Server Application 嗎? 然後選擇第一個 ISAPI/CGI 的那一個嗎?
如果是的話,有 Web Module 可以用,還是您是怎麼開始您的 Project 的? ===================引 用 boson 文 章=================== Request 應該是 WebModule 的 property, 但我是寫 ISAPI/CGI 的 WebService , 無法存取 WebModule
------
價值的展現,來自於你用哪一個角度來看待它!! |
boson
中階會員 ![]() ![]() ![]() 發表:74 回覆:155 積分:85 註冊:2004-07-31 發送簡訊給我 |
對, 我是建立 SOAP Server Application , 並選取 CGI Stand-alone excutable 的型態,
Service Name 我設為 MyService, 於是 Delphi 自動幫我建立了 Project1.dpr , Unit1.pas, MyServiceIntf.pas, MyServiceImpl.pas 幾個檔案, 我加上幾行程式在 MyServiceImpl 與 MyServiceIntf MyServiceIntf.pas 內容為 : [code delphi] unit MyServiceIntf; interface uses InvokeRegistry, Types, XSBuiltIns; type IMyService = interface(IInvokable) ['{C286B46B-326D-47A1-98E3-C94C4861CE56}'] function GetRemoteIP:string; stdcall; end; implementation initialization InvRegistry.RegisterInterface(TypeInfo(IMyService)); end. [/code] 而 MyServiceImpl.pas 內容為 : [code delphi] unit MyServiceImpl; interface uses SysUtils, InvokeRegistry, Types, XSBuiltIns, MyServiceIntf, Unit1; type TMyService = class(TInvokableClass, IMyService) public function GetRemoteIP:string; stdcall; end; implementation function TMyService.GetRemoteIP:string; stdcall; begin Try Result:=WebModule1.Request.RemoteAddr; except on E:Exception do Result:=E.Message; end; end; initialization InvRegistry.RegisterInvokableClass(TMyService); end. [/code] Project1.dpr 內容為 : [code delphi] program Project1; {$APPTYPE CONSOLE} uses ExceptionLog, WebBroker, CGIApp, Unit1 in 'Unit1.pas' {WebModule1: TWebModule}, MyServiceImpl in 'MyServiceImpl.pas', MyServiceIntf in 'MyServiceIntf.pas'; {$R *.res} begin Application.Initialize; Application.CreateForm(TWebModule1, WebModule1); Application.Run; end. [/code] 我另開一個專案, 在 Form 上放一個 Button, 再放一個 HTTPRIO 元件, 然後 use MyServiceIntf 設定好 HTTPRIO 的必要 property 之後, 在 Button 的 OnClick 事件中寫下一行程式 : [code delphi] procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage((HTTPRIO1 as IMyService).GetRemoteIP); end; [/code] 執行結果, 得到的是 Access violation 訊息 我在網路上搜尋相關文章, 好像 CGI/ISAPI 型式的 WebService 不能存取 WebModule ? |
careychen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
|
boson
中階會員 ![]() ![]() ![]() 發表:74 回覆:155 積分:85 註冊:2004-07-31 發送簡訊給我 |
|
careychen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
Hi, 我寫了個 Sample 依您的命名方式,您先直接看一下
SOAP CGI Sample Code 測試方法 1、將 CGISample.exe Copy 至您的 IIS 的 root 底下 2、啟動瀏灠器輸入以下兩個 url a、 http://localhost/CGISample.exe/ ==> Path / 第一個 WebActionItem ↑ (記得在 exe 後要加個 / ) 不然 XP 的不會錯,一上 2003 就會出錯哦!!! b、 http://localhost/CGISample.exe/Test ==> Path /Test 第二個 WebActionItem 並請注意以下事情 使用 IIS 5 (XP) 請在 IIS 的網站 -> 主目錄 -> 使用權限 -> 選擇【指令碼及執行檔】 使用 IIS 6 (2003) 除了上面步驟要設定外,還得在 【網頁服務延伸】中將【所有未知的 CGI 擴充程式】設為【已允許】 祝您順利 ===================引 用 boson 文 章=================== 就是使用了 Unit1 裏面的 WebModule , 結果發生了 Access violation 錯誤 雖然在 Project1.dpr 裏面, 已經執行了 Application.CreateForm(TWebModule1, WebModule1); 好像 WebModule 已經被 Create 了, 但卻是不能使用的 如果無法存取 WebModule , 那就不知道要從哪裏取得對方的 IP ?
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-11-01 22:44:09, 註解 無‧
|
boson
中階會員 ![]() ![]() ![]() 發表:74 回覆:155 積分:85 註冊:2004-07-31 發送簡訊給我 |
多謝你寫了個 Sample , 不過你我說的是不一樣的東西
你的 Sample 雖然是從 SOAP Server Application 這個精靈建立的, 但你其實是使用 WebBroker 技術, 把程式碼寫在 WebModule 底下, 並依 WebAction 來執行不同的動作, 基本上 WebBroker 程式輸出結果是 HTML 文件, 可以直接顯示在網頁上 而我說的是 WebService 技術, 程式碼寫在 *impl.pas 所建立的物件當中(請參見前面貼出的程式碼), 基本上, WebService 輸出的是 xml 文件, 需要在 Client 加以解析, 以從中取得需要的資料, 例如 Delphi 就提供了 HTTPRIO 元件來做這個解析的動作 我的問題關鍵在於, WebService 的程式, 無法從 *impl.pas 呼叫 WebModule, 因此無法使用 WebModule.Request 等等 property 我查了一下 Google, 發現 *impl.pas 無法使用 WebModule 這似乎是理所當然的事, 但我就不曉得除此之外, 能從哪裏取得 client 的 IP ? |
pcplayer99
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
|
boson
中階會員 ![]() ![]() ![]() 發表:74 回覆:155 積分:85 註冊:2004-07-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |