none
一部のUser-AgentでASP.NETの<script>タグが生成されない RRS feed

  • 質問

  • マシン: Windows Server 2008 R2

    Webサーバー: IIS 7.5 ASP.NET4.0 C#

    初めまして。

    ASP.NETでの開発をしております。

    通常、ASP.NETで作成したページでポストバック機能を使用した場合、動的に生成されたページにはscriptタグが埋め込まれ、__doPostBack()が実装されると思います。

    IEやGoogle ChromeでWebページにアクセスした場合は問題ないのですが、一部の特殊なブラウザからアクセスした場合、scriptタグが埋め込まれていないページが生成されます。

    調べたところ、ブラウザが送るリクエストのHTTPヘッダのUser-Agentが、Mozilla等の割と有名なものの場合はscriptタグが埋め込まれており、そうでない場合は駄目なようです。(ちなみに私が使用しているブラウザはBTSmartBrowserというUser-Agentで、ハンディターミナルという機器上で動作するものです。)

    どうやらIISサーバー側でUser-Agentを見てscriptタグを生成するかしないかを決めているように思われるのですが、どこでその設定をしているのかわかりません。

    とりあえず、web.configのsystem.web要素内にclientTargetというタグを追加してUser-Agentを追加すれば良いらしいという記事を見つけ、試したのですが、どうやらこれは違っていたようです。

    何か似たような事例をご存知の方、ご教示頂ければと思います。

    よろしくお願い致します。

    2011年8月18日 11:58

回答

  • ASP.NET Web サーバー コントロールとブラウザーの機能に一通りの説明がされています。HttpCapabilitiesBase.EcmaScriptVersionが1.0に満たない場合、<script>タグを生成しないようです。リンク先にもありますが、App_Browserディレクトリでカスタムブラウザーを定義することになるのかな。
    • 回答としてマーク 山本春海 2011年8月30日 8:59
    2011年8月18日 12:55
  • > web.configのsystem.web要素内にclientTargetというタグを追加してUser-Agent
    > を追加すれば良いらしいという記事を見つけ、試したのですが、どうやらこれは
    > 違っていたようです。

    web.config に定義を追加した後、Page.ClientTarget プロパティに追加した定義の
    エイリアスは設定されたのでしょうか?

    例えば、

     

    <clientTarget>
     <add alias="ie6" userAgent="Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1)" />
    </clientTarget>
    

    のように定義したのであれば、当該 aspx ページの @ Page ディレクティブに、

     

    ClientTarget="ie6"

    を追加してみてください。そうすると、ブラウザの検出機能が無効になり、ページ
    は指定したエイリアスと関連付けられたブラウザ機能(上記の場合 IE6 相当)を
    使用します。

    試しに、ClientTarget="uplevel" と設定してみたらどうなりますか? uplevel は
    デフォルトで定義済みのブラウザ機能で、ASP.NET 4 の場合 IE6 相当です。ちなみに
    EcmaScriptVersion は 3.0 となります。

    Page.ClientTarget プロパティ

    clientTarget 要素 (ASP.NET 設定スキーマ)


    なお、もし BTSmartBrowser 以外はブラウザの自動検出機能を有効にしておきたい場合
    は、以下のようなクラスを作って使うのがいいと思います。

     

    public class CBaseMasterEvents : System.Web.UI.Page
    {
     public CBaseMasterEvents()
     {
     Page.PreInit += new EventHandler(CBaseMaster_PreInit);
     }
    
     private void CBaseMaster_PreInit(object sender, EventArgs e) 
     { 
     if (Page.Request.Browser.Browser.Contains("BTSmartBrowser")) 
     {
      Page.ClientTarget = "uplevel";  // または定義したエイリアス
     } 
     } 
    }
    
    

     

     

     

     


    • 編集済み SurferOnWww 2011年8月19日 4:38 リンク修正
    • 回答としてマーク 山本春海 2011年8月30日 8:59
    2011年8月19日 4:32

すべての返信

  • ASP.NET Web サーバー コントロールとブラウザーの機能に一通りの説明がされています。HttpCapabilitiesBase.EcmaScriptVersionが1.0に満たない場合、<script>タグを生成しないようです。リンク先にもありますが、App_Browserディレクトリでカスタムブラウザーを定義することになるのかな。
    • 回答としてマーク 山本春海 2011年8月30日 8:59
    2011年8月18日 12:55
  • > web.configのsystem.web要素内にclientTargetというタグを追加してUser-Agent
    > を追加すれば良いらしいという記事を見つけ、試したのですが、どうやらこれは
    > 違っていたようです。

    web.config に定義を追加した後、Page.ClientTarget プロパティに追加した定義の
    エイリアスは設定されたのでしょうか?

    例えば、

     

    <clientTarget>
     <add alias="ie6" userAgent="Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1)" />
    </clientTarget>
    

    のように定義したのであれば、当該 aspx ページの @ Page ディレクティブに、

     

    ClientTarget="ie6"

    を追加してみてください。そうすると、ブラウザの検出機能が無効になり、ページ
    は指定したエイリアスと関連付けられたブラウザ機能(上記の場合 IE6 相当)を
    使用します。

    試しに、ClientTarget="uplevel" と設定してみたらどうなりますか? uplevel は
    デフォルトで定義済みのブラウザ機能で、ASP.NET 4 の場合 IE6 相当です。ちなみに
    EcmaScriptVersion は 3.0 となります。

    Page.ClientTarget プロパティ

    clientTarget 要素 (ASP.NET 設定スキーマ)


    なお、もし BTSmartBrowser 以外はブラウザの自動検出機能を有効にしておきたい場合
    は、以下のようなクラスを作って使うのがいいと思います。

     

    public class CBaseMasterEvents : System.Web.UI.Page
    {
     public CBaseMasterEvents()
     {
     Page.PreInit += new EventHandler(CBaseMaster_PreInit);
     }
    
     private void CBaseMaster_PreInit(object sender, EventArgs e) 
     { 
     if (Page.Request.Browser.Browser.Contains("BTSmartBrowser")) 
     {
      Page.ClientTarget = "uplevel";  // または定義したエイリアス
     } 
     } 
    }
    
    

     

     

     

     


    • 編集済み SurferOnWww 2011年8月19日 4:38 リンク修正
    • 回答としてマーク 山本春海 2011年8月30日 8:59
    2011年8月19日 4:32
  • >App_Browserディレクトリでカスタムブラウザーを定義することになるのかな。

    まさにやりたいことがこの方法で実現できました。

    ありがとうございます。

    2011年8月19日 7:12
  • ご回答ありがとうございます。

    @Pageディレクティブに書く方法だと全ページに書かないといけないため、今回は見送ることにしました。

    今回は佐祐理が仰る方法が目的と一致していたため、そちらの方法を使うことにしました。

    2011年8月19日 7:18