JSONPを介してデータを返すC#4.0の小さなWebサービスがあります。私が抱えている問題は、ドイツ語のウムラウト(ä、ö、ü)のような非ASCII文字が、クライアントに到着したときにスクランブルされることです。次の簡略化されたコードは、これを示しています。
// The interface
[OperationContract]
[WebGet( ResponseFormat = WebMessageFormat.Json )]
string GetTestString();
//...
// The implementation
public string GetTestString()
{
return "String with some German characters: äöüß";
}
ここで、URLを入力してFirefoxからWebメソッドにアクセスするとhttp://localhost:31843/TestWebService/GetTestString
、正しい結果が得られます。
"String with some German characters: äöüß"
ただし、JSONPが行うcallback
URL()でパラメーターを指定すると、スクランブルされた結果が得られます。http://localhost:31843/TestWebService/GetTestString?callback=Test
Test("String with some German characters: äöüß");
webHttpBinding.CrossDomainScriptAccessEnabled = true;
JSONPシリアライザーは、コードで設定してアクティブ化したMicrosoft.NET4.0フレームワークのシリアライザーです。そのシリアライザーの文字エンコードに影響を与える方法は見つかりませんでした。あなたはなにか考えはありますか?
別のヒント:スクランブルされた文字を含むJSONP文字列のWebリクエストの後、Firebugはコンソールに次のエラーを表示します。
「プレーンテキストドキュメントの文字エンコードが宣言されていません。ドキュメントにUS-ASCII範囲外の文字が含まれている場合、一部のブラウザ構成でテキストが文字化けしてレンダリングされます。ファイルの文字エンコードは転送で宣言する必要があります。プロトコルまたはファイルは、エンコーディング署名としてバイトオーダーマークを使用する必要があります。」
明らかにこれが問題のようです。しかし、問題は、正しいエンコーディングを構成する方法(そして、なぜデフォルトでUTF8ではないのか)です。
アップデート:
Microsoft.NETDataContractJsonSerializerにはバグがあると思います。JSONの最初のケースでは、次のHTTPヘッダーを送信します。
Content-Type: application/json; charset=utf-8
callback
URLパラメータを指定してJSONPを使用すると、次の情報が送信されます。
Content-Type: application/x-javascript
したがって、文字エンコードは指定されず、文字設定の決定はブラウザに任されます。Content-Type
インターネットでの調査の結果、DataContractJsonSerializerに適切な文字セットを使用してHTTPヘッダーを送信させる(簡単な)方法はないと確信しています。