全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5822
推到 Plurk!
推到 Facebook!

ISAPI 或 CGI 型式的 WebService, 如何取得客戶端的 IP ?

答題得分者是:pcplayer99
boson
中階會員


發表:71
回覆:154
積分:85
註冊:2004-07-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-31 23:33:40 IP:220.134.xxx.xxx 訂閱
剛開始撰寫 ISAPI 型式的 WebService 程式, 突然發現不知道如何取得 request 來自哪個 IP,
請有經驗的朋友幫忙一下, 謝謝
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-01 00:48:52 IP:59.126.xxx.xxx 訂閱
如果沒記錯的話,在 Request.RemoteAddr  就可以取得來源者的 ip 您試試

===================引 用 boson 文 章===================
剛開始撰寫 ISAPI 型式的 WebService 程式, 突然發現不知道如何取得 request 來自哪個 IP,
請有經驗的朋友幫忙一下, 謝謝
------
價值的展現,來自於你用哪一個角度來看待它!!
boson
中階會員


發表:71
回覆:154
積分:85
註冊:2004-07-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-01 01:02:20 IP:220.134.xxx.xxx 訂閱
Request 應該是 WebModule 的 property,
但我是寫 ISAPI/CGI 的 WebService , 無法存取 WebModule
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-01 12:43:19 IP:60.248.xxx.xxx 訂閱
好奇的問一下,您是用 Web Services -> SOAP Server Application 嗎? 然後選擇第一個 ISAPI/CGI 的那一個嗎?
如果是的話,有 Web Module 可以用,還是您是怎麼開始您的 Project 的?

===================引 用 boson 文 章===================
Request 應該是 WebModule 的 property,
但我是寫 ISAPI/CGI 的 WebService , 無法存取 WebModule
------
價值的展現,來自於你用哪一個角度來看待它!!
boson
中階會員


發表:71
回覆:154
積分:85
註冊:2004-07-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-01 15:09:00 IP:220.140.xxx.xxx 訂閱
對, 我是建立 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-01 17:27:46 IP:60.248.xxx.xxx 訂閱
那再問一下,那個 Unit1 不就是 WebModule 嗎?
裡面就有 Request 了難道您沒有使用這個?
------
價值的展現,來自於你用哪一個角度來看待它!!
boson
中階會員


發表:71
回覆:154
積分:85
註冊:2004-07-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-01 21:51:37 IP:220.140.xxx.xxx 訂閱
就是使用了 Unit1 裏面的 WebModule , 結果發生了 Access violation 錯誤

雖然在 Project1.dpr 裏面, 已經執行了 Application.CreateForm(TWebModule1, WebModule1);
好像 WebModule 已經被 Create 了, 但卻是不能使用的

如果無法存取 WebModule , 那就不知道要從哪裏取得對方的 IP ?

careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-01 22:41:49 IP:59.126.xxx.xxx 訂閱
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
中階會員


發表:71
回覆:154
積分:85
註冊:2004-07-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-11-01 23:57:42 IP:220.140.xxx.xxx 訂閱
多謝你寫了個 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
尊榮會員


發表:142
回覆:740
積分:591
註冊:2003-01-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-11-02 00:19:42 IP:121.15.xxx.xxx 訂閱
查了下我以前的笔记,这样子应该可以:

Delphi 7 , WebServices
服务器端实现的接口函数里,如何知道调用这个接口函数的客户端的
IP?
在实现部分的代码里, uses WebBrokerSoap
然后,可以通过以下代码直接获得当前调用这个函数的客户端的
IP:
GetSOAPWebModule.Request.RemoteAddr;
GetSOAPWebModule 这个函数是在 WebBrokerSoap 这个单元里的。
boson
中階會員


發表:71
回覆:154
積分:85
註冊:2004-07-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-11-02 00:36:37 IP:220.140.xxx.xxx 訂閱
謝謝 pcplayer99 網友, 你提供的方法確實可行

我想 Delphi 就是提供 WebBrokerSoap 單元給 WebService 程式使用的吧
系統時間:2017-12-15 16:15:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!