3

ASMX サービスと、ELMAH からのエラー ログを処理するコードを作成しました。データベースにすべてのフィールドを追加し、さらにいくつか追加します。1 つは、要求されたクライアントの IP アドレスです...

しかし、私はそれを得ることができません(読んでください、方法がわかりません)...

私は慣れています

string ipAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (ipAddress == "") ipAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

ただし、もちろん、ここでは HTML リクエストではなく SOAP リクエストであるため、適用されません。

ALL_HTTP ヘッダーで、次のすべての情報を取得します。

HTTP_CONNECTION:Keep-Alive
HTTP_CONTENT_LENGTH:440331
HTTP_CONTENT_TYPE:text/xml; charset=utf-8
HTTP_EXPECT:100-continue
HTTP_HOST:www.mydomainname.com
HTTP_USER_AGENT:Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3074)
HTTP_VSDEBUGGERCAUSALITYDATA:uIDPowJ7s0UYlmhEqcDjxYQT/TQAAAAADlaOOkJ5DUizA7gKLg3YEPur8pFWlaVFmpinSAOBTuIACQAA
HTTP_SOAPACTION:"http://www. mydomainname.com/webservices/ErrorReportService/ReportErrors"

要求された IP はどこでどのように取得できますか?

私は(まだ)いかなる種類の認証も使用していないことに注意してください... :)

4

1 に答える 1

2

HttpContext.Current.Request.UserHostAddress を使用できるはずですが、要求元のマシンがプロキシ サーバーまたは NAT デバイスの背後にある場合、これは信頼できません。代わりに、プロキシ サーバーのアドレスを取得します。


はっきりさせておきたいのですが、IP アドレスは適切な一意の識別子ではありません。コンピュータを識別するものではありません。せいぜい、特定のコンピュータ上の特定のネットワーク インターフェイスが特定の時点で使用しているネットワーク層アドレスを識別する程度です。別の時点で、同じネットワーク インターフェイスが別の IP アドレスを使用している可能性があります。別の時点では、同じコンピューターに複数のネットワーク インターフェイスがある場合があります。あなたにはわかりません。

TCP/IP プロトコルの設計者が、IP アドレスをコンピュータの一意の識別子として使用できないことを意図的に明確にしたことを読んだことを覚えているようです。残念ながら、それを読んだ人は少なすぎるようです。

于 2009-06-08T13:08:56.863 に答える