9934


現在の処理内容は、「http～/aaa/bbb/検索文字列」という形で、javascriptからC#サーバにpost送信を行います。サーバでは、検索文字列を使ってDBに検索を掛けます。

上記の処理において、検索文字列の部分を？などの記号のみで送信すると、「Failed to load resource: the server
responded with a status」というようなエラーになります。  
-追記  
検索文字列内に％などの記号が含まれている場合でも上記エラーが発生します

この問題を回避するために、javascript側で検索文字列のエンコードを行い、サーバ側で取得した検索文字列をデコードする方法をとろうと考えたのですが、記号をエンコード出来るエンコード方式が見当たらず解決に至りませんでした。

この問題の解決方法が分る方がいましたら、ご教授お願いします。


CC BY-SA 3.0
2015-05-08T01:14:43.870
9931
2015-05-09T00:41:56.273
2015-05-08T01:51:21.630
7626
7626
question
javascript c#
post送信時に、サーバに渡す文字列が記号のみだとエラーになってしまいます。


以下のコードを試してみてください。

[code]

    text = escape("?")
    url = "http://example.com/aaa/bbb/"+text
    
[/code]

追加調査してみたところ、現在`escape`は非推奨になっているようなので`encodeURIComponent`を利用したほうが良さそうです。

[code]

    text = encodeURIComponent("?")
    url = "http://example.com/aaa/bbb/"+text
    
[/code]


CC BY-SA 3.0
2015-05-08T01:24:02.423
9932
2015-05-08T01:29:35.473
2015-05-08T01:29:35.473
8351
8351
9931
answer


URLパスのディレクトリの一部に記号が入るリクエストがあり得るなら、その方式をやめた方が良いと思います。このルーティングは `/api/001/002/`
といった識別を扱う為の物です。どの言語のルータでもそうですが、サーバ側でルーティングが解決される際、ファイルシステムや言語の識別子として扱える文字列でバインディングされるので、どうしても扱えない文字という物があります。  
記号が入り得るならば、クエリパラメータで実装すべきです。


CC BY-SA 3.0
2015-05-08T02:32:59.133
9934
2015-05-08T03:11:37.600
2015-05-08T03:11:37.600
440
440
9931
answer


サーバー側がC#ということなのでASP.NETでの回避方法を。

この例外はASP.NETで[XSS](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)対策にURLをチェックしているため発生します。  
ですので、web.configで  

[code]

    <configuration>
      <system.web>
        <httpRuntime
          requestPathInvalidCharacters="" />
      </system.web>
    </configuration>
    
[/code]

と[`requestPathInvalidCharacters`](https://msdn.microsoft.com/ja-
jp/library/system.web.configuration.httpruntimesection.requestpathinvalidcharacters%28v=vs.110%29.aspx)を変更してやれば発生しなくなります。

なお実際にはアプリケーション全体で無効化するのではなく、

[code]

    <configuration>
      <location path="aaa/bbb">
        <system.web>
          <httpRuntime
            requestPathInvalidCharacters="" />
        </system.web>
      </location>
    </configuration>
    
[/code]

のように`location`要素で範囲を限定したほうが良いかと思います。

またASP.NETはファイル名のようなURLを静的ファイルとして処理するという仕様になっているため、そちらも変更する必要があるのではないでしょうか。

[code]

    <configuration>
      <system.webServer>
        <handlers>
          <add name="testHandler"
               path="aaa/bbb/*"
               verb="GET"
               type="System.Web.Handlers.TransferRequestHandler"
               preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
      </system.webServer>
    </configuration>
    
[/code]


CC BY-SA 3.0
2015-05-09T00:41:56.273
9971
2015-05-09T00:41:56.273
5750
9931
answer