16

みなさん、こんにちは。VisualStudio 2008(Cassini)を使用して、組み込みのWebサーバーでASP.NETアプリケーションをローカルでテストしたときに矛盾が見つかったようです。

dev.testhost.com127.0.0.1に関連付けて、ローカルマシンにホストを設定しました。これは、呼び出しに使用したホストヘッダーに応じて外観を変更する必要があるアプリケーションがあるためです。

ただし、を使用してテストアプリケーションをリクエストするhttp://dev.testhost.com:1234/index.aspxと、の値Request.Url.Hostは常に"localhost"です。一方、の値Request.Headers["host"]は(両方とも"dev.testhost.com:1234"そうなると思いますが)です。

2番目の値にポート番号が含まれていることは気になりませんが、ホスト名が完全に異なる理由については非常に混乱しています。これが既知の問題なのか、それとも仕様によるものなのか、誰か知っていますか?それとも私はばかですか?!

Request.Url.Hostテスト時にポート番号を削除する必要がないので、私はむしろ使用したいと思います...-混乱を引き起こす可能性があるため削除しました!-サム

4

3 に答える 3

9

Request.Headers["host"]はサーバーに接続するアプリケーションから受け取った値であり、もう1つの値は、サーバーがドメイン名を取得しようとしたときに取得する値です。

仮想ドメインの場合に使用されるため、ブラウザはリクエストで入力されたドメイン名を使用します。サーバーは、サーバー設定で設定されたもの、または最初に検出されたものを報告します。

編集:カッシーニのコードを見て、特定の設定が使用されているかどうかを確認すると、次のコードに気づきました。

public string RootUrl {
  get {
    if (_port != 80) {
      return "http://localhost:" + _port + _virtualPath;
    }
    else {
      return "http://localhost" + _virtualPath;
    }
  }
}

//
// Socket listening
//

public void Start() {
  try {
    _socket = CreateSocketBindAndListen(AddressFamily.InterNetwork, IPAddress.Loopback, _port);
  }
  catch {
    _socket = CreateSocketBindAndListen(AddressFamily.InterNetworkV6, IPAddress.IPv6Loopback, _port);
  }
  // …
}

カッシーニはローカルホストを明示的に参照しており、DNSの逆引き参照を試みていないという説明のようです。異なることに、それは使用しませんreturn "http://localhost" + _virtualPath;

于 2009-12-21T17:48:07.760 に答える
8

Request.Headers["host"]、ブラウザのhttpヘッダーで指定されたホストです。(たとえば、これはFiddlerまたはHttpWatchでトラフィックを調べた場合に表示されるものです)

ただし、ASP.NETはこれ(およびその他の要求情報)をSystem.Uriインスタンスに格納し、インスタンスは要求文字列をその構成要素に解析します。この場合、「ホスト」は文字通り、元のリクエストのホストマシン部分を指します(たとえば、tcpポートがポートにある場合)。

このSystem.Uriクラスは、リクエストをその部分に分割することからすべての苦痛を取り除く非常に便利なヘルパークラスですが、httpヘッダーの「Host:」(さらに言えば「GET」)は単なる生のリクエストデータです。

どちらも同じ名前ですが、同じものを意味するものではありません。

于 2009-12-21T17:48:21.740 に答える
1

これは、w3の仕様が何を言っているのか、MicrosoftUri.Hostプロパティに何が含まれているのかという問題です。命名は、MSが同一の機能を提供しようとする試みを意味するものではありません。ポート番号を含む関数はUri.Authorityです。

あなたが投稿したアップデートで、あなたはまだ同じ問題に直面していて、それの異なる側面を調べているだけです。Uri.Hostプロパティは、w3仕様で定義されているヘッダーと同じ機能を実行するように明示的または暗黙的に記述されていません。長い形式で、Uri.HostのMSDNページからの引用を次に示します。

Uri.Hostプロパティ
このインスタンスのホストコンポーネントを取得します。

プロパティ値

タイプ:System.String

ホスト名を含む文字列。これは通常、サーバーのDNSホスト名またはIPアドレスです。

これがヘッダーの内容と一致するという保証はなく、何らかの形式でホスト名を表すだけです。

于 2009-12-21T17:44:37.673 に答える