none
Web APIで500 Internal Server Errorが発生します RRS feed

  • 質問

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

    Web APIのパラメータ部分に日本語ではなく、アルファベットで指定するとエラーは出ず、正常に取得できるのですが、

    パラメータ部分に日本語が含まれている場合に500 Internal Server Errorが発生してしまいます。

    対応方法をご存知の方がおられましたら、教授頂きたくお問い合わせさせて頂きました。

    宜しくお願い致します。


    -----------------------------------------------------------------
    開発環境
    Windows8 Pro、VsiaulStudio Commity2013 (ASP.net C#)
    ASP.NET開発サーバ、IIS8、Framework4.5
    MySQL Server 5.6、MySQL Connector Net 6.9.6
    -------------------------------------------------------------------

    //WebApiConfig

     config.Routes.MapHttpRoute(
         name: "test",
         routeTemplate: "api/test/{corp_id}",
         defaults: new { controller = "test", corp_id = RouteParameter.Optional }
     );
    

    //Controller

    public class testController : ApiController
    {
    
      // GET ( corp_id )
      public IEnumerable<string> Get(string corp_id)
      {                
        try
        {
            string[] str_arry;
            bool data_flg = false;
                            
            //サーバー上のディレクトリパスを取得する
            string strpath = HttpContext.Current.Server.MapPath("../../data/" + corp_id);
                
            string[] files = Directory.GetFiles(strpath,"*.png");
            str_arry = new string[files.Length];
    
            int i = 0;
            foreach (string s in files)
            {
                data_flg = true;
                str_arry[i] = System.IO.Path.GetFileName(s);
                i += 1;
            }
    
            if (data_flg == false)
            {
                return new string[] { "nodata" };
            }
            else
            {
                return str_arry;
            }                                 
        }
        catch (MySqlException ex)
        {
            Debug.WriteLine(ex.ErrorCode.ToString());
            return new string[] { "failure" };
        }
        finally
        {
        
        }
      }
    }
    


    2015年7月3日 22:54

回答

  • 使っているブラウザを聞くのを忘れましたが IE ですか?

    > アクションメソッドの要求は具体的にどのように行っているのですか?

    に対する答えがいただけないので想像ですが・・・

    jQuery.Ajax で要求をかけている場合、例えば以下のように url の "A" を全角にすると、自分の開発環境の IE9 の場合は Shift_JIS のパーセントエンコーディングで要求が出ます。(GET http://<ホスト>/api/heroes/%82%60 という感じ)

    $.ajax({
        type: "GET",
        url: "api/heroes/A",
        contentType: "application/json; charset=utf-8",
        // ・・・中略・・・
    });

    Firefox は UTF-8 のパーセントエンコーディングになります。なので、多分期待した結果が得られるのではないかと思います。やってみてください。


    > ブラウザに下記をコピペしてリクエストすると、正常に結果が表示されます。

    その場合は IE でも UTF-8 のパーセントエンコーディングになるからでしょう。詳しくは以下のページを見てください。

    ブラウザによる URL のエンコーディング
    http://surferonwww.info/BlogEngine/post/2011/11/07/Encoding-of-URL-directly-written-in-address-bar-of-browser.aspx


    > Fiddler(当方のバージョンは4です) で確認すると、

    実行結果を見るのではなく、どういう要求が出て行っているかを見てください。

    • 回答としてマーク hys73 2015年7月7日 9:21
    2015年7月4日 1:34

すべての返信

  • 回答ではなく不足情報の提供のお願いですが・・・

    > Web APIのパラメータ部分に日本語ではなく、アルファベットで指定するとエラーは
    > 出ず、正常に取得できるのですが、パラメータ部分に日本語が含まれている場合に
    > 500 Internal Server Errorが発生してしまいます。

    「パラメータ部分」とは何ですか?(corp_id のこと?)

    アクションメソッドの要求は具体的にどのように行っているのですか?

    デバッグ(アクションメソッドの適当な行にブレークポイントを設けてステップ実行するなど)したでしょうか? どの行でどのようなエラーメッセージが出るのですか?

    アクションメソッドを要求したときの要求の内容を Fiddler2 などのキャプチャツールで見て、期待通りになってますか?

    2015年7月4日 0:41
  • 記載した内容がわかりにくく申し訳ありません。

    パラメータ部分とはcorp_id ことになります。

    ブラウザに下記をコピペしてリクエストすると、正常に結果が表示されます。

    http://servername/api/test/corp_name
    http://servername/api/test/あいうえお

    デバッグもしてみましたが、特にエラーにはなっていないようなんです。

    ですが、Fiddler(当方のバージョンは4です) で確認すると、

    http://servername/api/test/corp_name 問題なく表示され、

    http://servername/api/test/あいうえお 500 Internal Server Errorになってしまいます。


    2015年7月4日 1:09
  • 使っているブラウザを聞くのを忘れましたが IE ですか?

    > アクションメソッドの要求は具体的にどのように行っているのですか?

    に対する答えがいただけないので想像ですが・・・

    jQuery.Ajax で要求をかけている場合、例えば以下のように url の "A" を全角にすると、自分の開発環境の IE9 の場合は Shift_JIS のパーセントエンコーディングで要求が出ます。(GET http://<ホスト>/api/heroes/%82%60 という感じ)

    $.ajax({
        type: "GET",
        url: "api/heroes/A",
        contentType: "application/json; charset=utf-8",
        // ・・・中略・・・
    });

    Firefox は UTF-8 のパーセントエンコーディングになります。なので、多分期待した結果が得られるのではないかと思います。やってみてください。


    > ブラウザに下記をコピペしてリクエストすると、正常に結果が表示されます。

    その場合は IE でも UTF-8 のパーセントエンコーディングになるからでしょう。詳しくは以下のページを見てください。

    ブラウザによる URL のエンコーディング
    http://surferonwww.info/BlogEngine/post/2011/11/07/Encoding-of-URL-directly-written-in-address-bar-of-browser.aspx


    > Fiddler(当方のバージョンは4です) で確認すると、

    実行結果を見るのではなく、どういう要求が出て行っているかを見てください。

    • 回答としてマーク hys73 2015年7月7日 9:21
    2015年7月4日 1:34
  • ありがとうございます。

    使っているブラウザはGoogleChome、アクションメソッドは

    UNITYのC#からWWWクラスで要求をかけておりました。

    結果的におっしゃる通りパーセントエンコーディングの問題でした。

    ありがとうございました。

    2015年7月7日 9:25