2014-04-30 47 views
2

它基本上就是這樣,但是我在POST數據中有一個國家符號的問題。他們被損壞到服務。ServiceStack是否支持來自純html的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

回答

2

默認我當時一看這個,問題是,HTTP偵聽器推斷出的字符編碼請求作爲Windows-1251代替UTF-8它這樣做是因爲在Content-Type HTTP頭中指定了請求中的字符編碼,因此它會按預期工作,如果你在小提琴手改變的Content-Type到:

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

不幸的是HTML表單不讓您可以使用字符集指定內容類型,如下所示:

<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> 

但瀏覽器有效地忽略這一點,併發送默認表單內容類型代替,例如:

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

隨着缺少的內容類型的HTTP監聽器試圖從POST推斷的Content-Type在這種情況下「編數據:

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

其推斷爲Windows-1251並解析使用該編碼的值。

有幾個解決方案首先是要覆蓋具有just been enabled in this commit內容編碼和強制UTF-8編碼,e.g:

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; 
} 

此功能將在v4.0.19版本這是now available on MyGet

第二種解決方案是有效提供的提示,HTTP請求來推斷請求爲UTF-8,您可以用英文指定的第一個字段做,例如:

<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字符集。

+0

非常感謝您的快速回答!你計劃什麼時候發佈v4.0.19? –

+0

@ alexandrov.dmitry很難說,因爲我目前正在研究一個我想先完成的功能,可能會在1-2周左右。但是你[現在仍然可以從MyGet獲得v4.0.19](https://github.com/ServiceStack/ServiceStack/wiki/MyGet)。 – mythz

+0

是的,只是檢查,4.0.19工作正常! –