none
IIS7.5で設定したアプリケーションのエイリアスがハイパーリンクから欠落する RRS feed

  • 質問

  • お世話になっております。

    【目的】
    IISで設定したアプリケーションに関わるASP.NET Web Formsの動作を、
    A環境とB環境で一致させたい。

    【環境】
    A環境
    ・Windows Server 2008 R2 Enterprise
    ・IIS 7.5.7600.16385

    B環境
    ・Windows Server 2008 R2 Standard
    ・IIS 7.5.7600.16385

    【前提】
    以下の項目はA環境とB環境で一致しています。
    ・アプリケーションの設定
    ・アプリケーション内のフォルダ構成
    ・アプリケーション内のファイル

    【アプリケーションの物理ディレクトリ構成】
    D:.
    ├─test
    │  ├─AP
    │  │  └─JOB
    │  │      └─JOB

    ※A、Bの両環境共通
    ※D:\test\AP\JOB\JOBをアプリケーションの物理ディレクトリとして設定

    【B環境でのアプリケーションの作成手順】
    1.IISマネージャーを開き、「Default Web Site」を右クリックし、
       「仮想ディレクトリの追加」を選択。
    2.仮想ディレクトリのエイリアス、物理パス(D:\test\AP\JOB\JOB)を入力
    3.作成した仮想ディレクトリを右クリックして「アプリケーションへの変換」を実行

    ※A環境での作成手順は不明ですが、A環境の設定を確認すると、B環境の設定と同様になっています。

    【事象】
    アプリケーション内の同一ディレクトリ(D:\test\AP\JOB\JOB)にX.aspx、Y.aspxが存在。
    B環境では、X.aspxに埋め込まれているY.aspxへのハイパーリンクに
    アプリケーションのエイリアス部分が欠落しており、画面遷移が失敗する。

    (A環境のハイパーリンク)http://localhost/(アプリケーションのエイリアス)/Y.aspx
    (B環境のハイパーリンク)http://localhost/Y.aspx

    ■エラー画面のメッセージ
    -----------------
    '/' アプリケーションでサーバー エラーが発生しました。
    リソースが見つかりませんでした。 
    説明: HTTP 404. 探しているリソース (または、その依存関係の 1 つ) が削除されたか、名前が変更されたか、また一時的に使用できません。以下の URL のスペルが正しいことを確認してください。 

    要求された URL: /Y.aspx

    バージョン情報: Microsoft .NET Framework バージョン:2.0.50727.5420; ASP.NET バージョン:2.0.50727.5420 
    -----------------

    ■「ソースの表示」よりX.aspxからY.aspxへのリンク部分
    ・A環境
    <a href="http://localhost/(アプリケーションのエイリアス)/Y.aspx"></a>
    ・B環境
    <a href="/Y.aspx"></a>

    【その他の状況】
    ・B環境で http://localhost/(アプリケーションのエイリアス)/Y.aspx を指定すると正常に画面が表示されます。
    ・aspxファイル等には環境に依存するような記述はありません。
    ・ハイパーリンクを生成するファイルも両環境で同一のものを使用しています。

    ○ハイパーリンクの生成ロジック
    Const m_ASPX_NAME As String = "/X.aspx"
    Const m_JOB As String = "/Y.aspx"
    Dim h As New HyperLink()

    If Request.Url.AbsoluteUri.ToString.IndexOf(m_ASPX_NAME) > -1 Then
        m_BaseUrl = Request.Url.AbsoluteUri.ToString.Substring(0, Request.Url.AbsoluteUri.ToString.IndexOf(m_ASPX_NAME))
        Session("BaseUrl") = m_BaseUrl
    Else
        m_BaseUrl = Session("BaseUrl")
    End If

    'ハイパーリンク生成
    h.NavigateUrl = m_BaseUrl & m_JOB


    画面遷移が失敗する原因と考えられることをご教示頂けますでしょうか。

    • 編集済み tks_wt 2015年11月13日 9:24
    2015年11月12日 9:04

すべての返信

  • 回答ではなく質問ですみません。

    Windows Server 2008 R2 ですと IIS のバージョンは 7.5 ですよね。そうであればタイトルと質問文を訂正しておいていただけますか。

    Web アプリは ASP.NET Web Forms アプリですよね。.aspx という名前からそう理解していますが。

    仮想ディレクトリではなくてアプリケーションに設定したのですよね。IIS7 以降では仮想ディレクトリとアプリケーションが区別されます。ASP.NET Web Forms アプリですとサイトまたはアプリケーションに設定する必要があります。

    A 環境と B 環境の違いがよく分かりません。同じサーバー内で物理ディレクトリが違う別のアプリケーションという意味ですか?

    物理ディレクトリの構成がどうなっているか、それを IIS7.5 でどのように設定したかを具体的に書いていただけませんか?

    ブラウザのアドレスバーに URL を入力するとどのページも問題なく呼び出せるのであれば、ハイパーリンクの設定が間違っているのだと思います。そうであれば、以下の記事を読んで正しく設定されているか確認してください。

    ASP.NET Web サイトのパス
    https://msdn.microsoft.com/ja-jp/library/ms178116(v=VS.100).aspx

    • 編集済み SurferOnWww 2015年11月12日 9:35 ブラウザの・・・以下追加
    2015年11月12日 9:20
  • ご指摘とご助言を頂き有難うございます。

    >Web アプリは ASP.NET Web Forms アプリですよね。.aspx という名前からそう理解していますが。
    ⇒ご認識の通りです。

    >仮想ディレクトリではなくてアプリケーションに設定したのですよね。IIS7 以降では仮想ディレクトリとアプリケーションが区別されます。ASP.NET Web Forms アプリですとサイトまたはアプリケーションに設定する必要があります。
    ⇒ご認識の通りです。

    >A 環境と B 環境の違いがよく分かりません。同じサーバー内で物理ディレクトリが違う別のアプリケーションという意味ですか?
    ⇒説明が不足しており申し訳ありません。それぞれ別のサーバーとなります。

    >物理ディレクトリの構成がどうなっているか、それを IIS7.5 でどのように設定したかを具体的に書いていただけませんか?
    ⇒質問内容に追記致しました。

    ハイパーリンクの設定につきましては、
    両環境で使用しているファイルとその配置が一致していますので、問題はないと思います。
    そのため、IISマネージャーでの設定に問題があったのではないかと考えています。
    2015年11月12日 11:06
  • > それぞれ別のサーバーとなります。

    別サーバーには http://localhost ... としてアクセスできないのは分かりますでしょうか?

    localhost は自分自身なので、例えば A サーバーのブラウザを使った場合、A サーバーのコンテンツには localhost としてアクセスできも、B サーバーにはアクセスできません。

    根本的なところを理解されていないような気がします。

    サーバー A、サーバー B、クライアント PC が全てイントラネット内にあって、サーバー名で名前解決ができるなら(言っている事分かります?)、クライアント PC からは http://localhost/(アプリケーションのエイリアス)/Y.aspx ではなくて、http://(サーバー名)/(アプリケーションのエイリアス)/Y.aspx でないとダメです。

    もちろんファイアウォールの穴あけ等は必要です。

    > IISマネージャーでの設定に問題があったのではないかと考えています。

    IIS マネージャーでの設定の問題ではなく、基本的なことを理解されてなくて、できないことをやっていると言うことだと思います。

    2015年11月12日 11:41
  • さすがにそれぞれのサーバでlocalhostで動作確認したという意味でしょう。

    htmlのbaseが変わってしまっている感じなんですかね…?

    X.aspxからY.aspxへのリンクは、相対URLで「Y.aspx」という感じになっているんですかね?

    X.aspxの表示は、両方とも「localhost/アプリケーションのエイリアス/X.aspx」という形でのアクセスということでいいですかね?

    ※ところでちなみに仮想ディレクトリとアプリケーションの関係はIIS6でも基本は同じだったと思います。

    2015年11月12日 17:53
  • 重要な情報を聞くのを忘れてました。

    ・リンクはどうやって生成しているのか?

    ・結果のhtml(簡単には、ソースの表示で表示される内容が(特にリンクの部分)同一か?

    ひとまずこの辺りの情報を提供してください。

    ※結果のhtmlのリンク部分が変わっているのか同じなのか、というところを明確に

    2015年11月13日 0:21
  • 説明が不足していましたが、localhostはそれぞれ、自身のサーバを示しています。
    2015年11月13日 9:44
  • ご返信頂き有難うございます。

    >X.aspxからY.aspxへのリンクは、相対URLで「Y.aspx」という感じになっているんですかね?
    ⇒リンクは絶対URLの形式です。

    >X.aspxの表示は、両方とも「localhost/アプリケーションのエイリアス/X.aspx」という形でのアクセスということでいいですかね?
    ⇒絶対URL(http://localhost/(アプリケーションのエイリアス)/X.aspx)の形式でアクセスしています。

    >・リンクはどうやって生成しているのか?
    ⇒質問内容にロジックを追記致しました。

    >・結果のhtml(簡単には、ソースの表示で表示される内容が(特にリンクの部分)同一か?
    ⇒「ソースの表示」で確認しましたが、リンクの部分以外は同一となっていました。
     リンクの部分の違いは以下の通りです。
     ・A環境
     <a href="http://localhost/(アプリケーションのエイリアス)/Y.aspx"></a>
     ・B環境
     <a href="/Y.aspx"></a>
    2015年11月13日 9:44
  • 「環境」という言い方は適切ではなくて誤解を招くような気がします。A サーバー、B サーバーと呼びませんか?

    > リンクの部分の違いは以下の通りです。
    > ・A環境
    > <a href="http://localhost/(アプリケーションのエイリアス)/Y.aspx"></a>
    > ・B環境
    > <a href="/Y.aspx"></a>

    A サーバーでも B サーバーでも同じエイリアス名でアプリケーションとして設定してあるのですよね。

    そうだとすると A サーバーでうまく行って、B サーバーでは HTTP 404 (Not Found・・・見つからない)になるのは当たり前だと思うのですが。

    両方とも <a href="/(アプリケーションのエイリアス)/Y.aspx"></a> としたらうまくいくと思います。確認ください。

    私の一番最初のレスで以下の通り書いたのですが、読んでいただけたでしょうか? 読んで確認していたら分かったはずですが・・・

    > ブラウザのアドレスバーに URL を入力するとどのページも問題なく呼び出せるのであれば、ハイパーリンクの設定が
    > 間違っているのだと思います。そうであれば、以下の記事を読んで正しく設定されているか確認してください。
    >
    > ASP.NET Web サイトのパス
    > https://msdn.microsoft.com/ja-jp/library/ms178116(v=VS.100).aspx


    【追伸】

    ASP.NET が html コードにレンダリングした結果 href 属性に設定される URL が違うと言ってますか?(.aspx には <a href="... /> と言うような静的なリテラルではなく、動的に href の設定が変わるようになっているとか?)

    そうであれば、.aspx のその部分のコードをアップしていただけませんか?


    【追伸2】

    コードは一番最初の質問を修正して書いたんですね。(今後は新しいレスに書いていただくようお願いします。分かりにくいので)

    Const m_ASPX_NAME As String = "/X.aspx"
    Const m_JOB As String = "/Y.aspx"
    Dim h As New HyperLink()
     
    If Request.Url.AbsoluteUri.ToString.IndexOf(m_ASPX_NAME) > -1 Then
        m_BaseUrl = Request.Url.AbsoluteUri.ToString.Substring(0, Request.Url.AbsoluteUri.ToString.IndexOf(m_ASPX_NAME))
        Session("BaseUrl") = m_BaseUrl
    Else
        m_BaseUrl = Session("BaseUrl")
    End If
     
    'ハイパーリンク生成
    h.NavigateUrl = m_BaseUrl & m_JOB

    ということですと、A サーバーでは m_BaseUrl が "http://localhost/(アプリケーションのエイリアス)"、B サーバーでは ""(空白)になるということですが何故そうなるのか分かりません。

    デバッガで追いかけて原因を探れますか? それができなければそういうコードは止めて、もっと簡単にルート演算子 (~) を使って以下のようにしたらいかがですか?

    'ハイパーリンク生成
    h.NavigateUrl = "~" & m_JOB

    • 編集済み SurferOnWww 2015年11月13日 13:08 追伸2追記
    2015年11月13日 10:40
  • リンクの生成方法がだいぶ妙なコードになってますねえ…

    環境要因が原因かは何とも言えませんが、このコードだと状況によっておかしな動作をすることはありえそうですので、やり方自体を変えた方がいいです。

    ※たとえば大文字小文字が違うリクエストをしたとかでも、簡単におかしな動作になりそうです。

    とりあえずSurferOnWwwさんが書いているようなやり方辺りか、あるいは./とかで明示的に相対パスが使えたかちょっと覚えてませんが、ともかく相対的なパス指定を活用する方法にしてください。


    • 編集済み なちゃ 2015年11月13日 23:33
    2015年11月13日 14:30
  • 【追伸3】

    アプリケーション間での移植や、同一アプリケーション内でもページを別のフォルダーへ移動する場合のことを考えてコードでパスを取得していると想像していますが・・・

    そうだとしても、そもそも X.aspx と Y.aspx は同じフォルダにあることが条件ですよね(コードを見るとそうなっている)。

    であれば、ルート演算子 (~) を使う必要もなく、以下のようにすれば、

    'ハイパーリンク生成
     h.NavigateUrl = m_JOB  ' m_JOB は "Y.aspx"


    X.aspx の html ソースでは <a href="Y.aspx" ... となって、X.aspx と同一フォルダにある Y.aspx へのリンクができます。

    そのあたりは先に紹介した以下の記事を読んでもらえばわかるはず。読んでないなら是非読んでください。

    ASP.NET Web サイトのパス
    https://msdn.microsoft.com/ja-jp/library/ms178116(v=VS.100).aspx

    どうしてもコードで設定したいということがあれば VirtualPathUtility を使ってはいかが? 使い方の例は以下の記事を見てください。

    パスの設定
    http://surferonwww.info/BlogEngine/post/2011/09/04/How-to-specify-path-for-respurce-in-ASPNET-web-application.aspx


    あと、今回のように Session を使う場合、使う前に必要な情報が入っているかどうか確認しましょう。Session("BaseUrl") が Nothing か否かだけでもチェックしてから使っていれば、話はずいぶん違ってきたのではないでしょうか?


    #今回の話は IIS ではなくて ASP.NET Web アプリの VB.NET のコードの話でしたね。

    #質問するフォーラムを ASP.NET にして、最初の質問に HyperLink 生成のコードをアップして、質問の仕方を「A サーバーは期待通りだが B サーバーでは <a href="/Y.aspx" ... になってしまうのは何故?」というようにれば分かりやすかったです。

    #次回質問される時はそのあたりを考慮に入れていただければと思います。


    • 編集済み SurferOnWww 2015年11月14日 3:36 Typo 訂正
    2015年11月14日 3:12