2

基本的にはありますが、POST データの国別記号に問題があります。それらはサービスに破損しています。

私は非常に基本的なマークアップを持っています:

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
    <form action="/hello" method="POST">
        <input name="Name" id="Name"/>
        <input type="submit" value="Send"/>
    </form>
</body>
</html>

ブラウザは以下を送信します。

ヘッダー:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:uk,ru;q=0.8,en;q=0.6 Cache-Control:max-age=0
Connection:keep-alive Content-Length:41
Content-Type:application/x-www-form-urlencoded
Cookie:ss-pid=s2uF57+2p07xnT9nUcpw; X-UAId= 
Host:localhost:2012
Origin:http://localhost:2012 
Referer:http://localhost:2012/Great
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36

フォームデータ:

Name=%D0%BF%D1%80%D0%B8%D0%B2%D1%96%D1%82

このサービスでは、次のものを受け取ります。

РїСЂРёРІС–С

this.Request.OriginalRequest.EncodingName は「キリル文字 (Windows)」です。ここはUTF-8でいいと思います。期待される結果は

привіт

PS。App.config (セルフホストを使用しています) はhttp://www.ienablemuch.com/2012/12/self-hosting-servicestack-serving.htmlのデフォルトです

4

1 に答える 1

2

私はこれを調べましたが、問題は、リクエストの文字エンコーディングがHTTPヘッダーで指定されているため、HTTPリスナーがリクエストの文字エンコーディングを推測するのではWindows-1251なく、期待どおりに機能することです。フィドラーの Content-Type を次のように変更する場合:UTF-8Content-Type

Content-Type: application/x-www-form-urlencoded; charset=utf-8

残念ながら、HTML フォームでは、次のような文字セットで Content-Type を指定することはできません。

<form action="/hello" method="POST" 
      enctype="application/x-www-form-urlencoded; charset=utf-8">
    <input name="Name" id="Name"/>
    <input type="submit" value="Send"/>
</form>

しかし、ブラウザは事実上これを無視し、代わりにデフォルトの Form Content-Type を送信します。

Content-Type: application/x-www-form-urlencoded

この場合、Content-Type がないため、HTTP リスナーは POST されたデータから Content-Type を推測しようとします。

Name=%D0%BF%D1%80%D0%B8%D0%B2%D1%96%D1%82

Windows-1251そのエンコーディングを使用して値を推測し、解析します。

最初の解決策は、このコミットで有効になったばかりのコンテンツ エンコーディングをオーバーライドし、UTF-8 エンコーディングを強制することです。

public override ListenerRequest CreateRequest(HttpListenerContext httpContext, 
    string operationName)
{
    var req = new ListenerRequest(httpContext, 
        operationName, 
        RequestAttributes.None)
    {
        ContentEncoding = Encoding.UTF8
    };
    //Important: Set ContentEncoding before parsing attrs as it parses FORM Body
    req.RequestAttributes = req.GetAttributes(); 
    return req;
}

この機能は、現在 MyGet で利用できるv4.0.19 リリースに含まれます。

UTF-82 番目の解決策は、英語で最初のフィールドを指定することで実行できるリクエストを推測するためのヒントを HTTP リクエストに効果的に提供することです。

<form action="/hello" method="POST">
    <input type="hidden" name="force" value="UTF-8"/>
    <input name="Name" id="Name"/>
    <input type="submit" value="Send"/>
</form>

force=UTF-8英語以外に特別なことは何もなく、ASCII 文字セットを使用しています。

于 2014-04-30T06:46:07.280 に答える