2

POST メソッドを使用してファイルを受け取り、操作を行い、HTTP 応答を使用してそれらを返す Web API を開発しました。Web API は、出力ファイル名などの http ヘッダーに追加データを返します。問題は、HttpWebResponse で応答を投稿して受信すると、応答ヘッダー値でスクランブルされたファイル名が取得され、Unicode 文字が失われることです。

たとえば、наталья.docxファイルを送信すると、 наÑалÑÑ.pdf.

完全な応答ヘッダー

Pragma: no-cache
Transfer-Encoding: chunked
Access-Control-Allow-Origin: *
Result: True
StoreFile: false
Timeout: 300
OutputFileName: наÑалÑÑ.pdf
Content-Disposition: attachment; filename=наÑалÑÑ.pdf
Cache-Control: no-cache, no-store
Content-Type: application/pdf
Date: Wed, 12 Sep 2012 07:21:37 GMT
Expires: -1
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4

このようなヘッダー値を読んでいます

HttpWebResponse webResponse = FormUpload.MultipartFormDataPost(postdatatoserver);
using (Stream clientResponse = webResponse.GetResponseStream())
if (webResponse.StatusCode == HttpStatusCode.OK)
{
   Helpers.CopyStream(clientResponse, outStream);
   webHeaderCollection = webResponse.Headers;
}

スクランブルされた文字を応答ヘッダーから読み取るときに Unicode にデコードするだけでよいのか、Web API サーバーからデータを送信するときに応答ヘッダーにエンコーディングを含める必要があるのか​​ わかりません。

4

1 に答える 1

0

http://msdn.microsoft.com/en-us/library/system.net.webresponse.getresponsestream.aspxを参照してください。

Stream ReceiveStream = myWebResponse.GetResponseStream();
Encoding enc = System.Text.Encoding.UTF8;

// Pipe the stream to a higher level stream reader with the required encoding format. 
StreamReader readStream = new StreamReader(ReceiveStream, enc);

あなたも試すかもしれません

System.Text.Encoding.Default
or
System.Text.Encoding.UTF7
or
System.Text.Encoding.Unicode
or 
System.Text.Encoding.GetEncoding(1251)
or 
System.Text.Encoding.GetEncoding(1252)
or
System.Text.Encoding.GetEncoding(20866)

より長いリストについては、こちらを参照してください:
http://www.pcreview.co.uk/forums/system-text-encoding-getencoding-whatvalidstrings-t1406242.html

編集:

現在の [RFC 2045] の文法では、パラメータ値 (したがって Content-Disposition ファイル名) が US-ASCII に制限されています。

そのため、StreamReader エンコーディングに関係なく、HTTP ヘッダーは常に ASCII 形式で送信されます。
IE は標準に準拠していないため、回避策があります: ファイル名を UrlEncode します。

したがって、ファイルを書き戻すときにこれを行う必要があります。

// IE needs url encoding, FF doesn't support it, Google Chrome doesn't care
if (Request.Browser.IsBrowser ("IE"))
{
    fileName = Server.UrlEncode(fileName);
}

Response.Clear ();
Response.AddHeader ("content-disposition", String.Format ("attachment;filename=\"{0}\"", fileName));
Response.AddHeader ("Content-Length", data.Length.ToString (CultureInfo.InvariantCulture));
Response.ContentType = mimeType;
Response.BinaryWrite(data);

Content-Disposition ヘッダーの Unicodeに従って 、アスタリスクを追加し、適切なエンコーディングを追加できます。

于 2012-09-12T09:24:30.220 に答える