0

私は次のようなWCF契約を結んでいます。

[OperationContract]
[WebInvoke(Method = "POST")]
string Import_CSV();

次に、Import_CSV()メソッドはHttpContext.Current.Request.Filesからのファイルアップロードを正常に受け入れます... Import_CSV()メソッドは、成功または発生した特定のエラーのメッセージを含む文字列を返します。

ただし、アップロードされたファイルに対して実行するサーバー操作で複数のエラーが発生した場合、私の目標はcsvファイルを生成し、それをユーザーに提供してダウンロードできるようにすることです。

そこで、csvコンテンツを作成し、ユーザーがダウンロードできるように表示したいと思います。

Statuscodeを(int)HttpStatusCode.OKに設定し、成功した場合は空の文字列を返し、response.writeを使用して次のように新しく生成されたcsvファイルを提供します。

HttpContext.current.Response.ContentType = "text/csv";
HttpContext.current.Response.AddHeader("Content-Disposition", "attachment;filename=ImportErrors.csv");
HttpContext.current.Response.AddHeader("Pragma", "no-cache");
HttpContext.current.Response.AddHeader("Cache-Control", "no-cache");
foreach (var line in csvLines)
{
    context.Response.Write(line);
    context.Response.Write(Environment.NewLine);
    context.Response.Flush();
}
context.ApplicationInstance.CompleteRequest();

Internet Explorerでは、すべてが計画どおりに機能しているように見えますが、FirefoxとChromeはこのデータをどう処理するかを知らないようです。コンテンツにさまざまなhttpステータスコードとさまざまなmimeタイプを設定しようとしましたが、間違った方向に進んでいるのではないかと思います。

助言がありますか?

私は最近、スタックオーバーフローについてこのパズルの小さなピースをここに尋ねました:response.writeの88バイトの制限?

回答は非常に役に立ちましたが、私の質問はWCFに関するもので、このサービスコールでテキストとファイルの両方を返し、IEだけでなく機能する必要があります。ありがとう!


Chromeで使用する場合のヘッダー:

リクエスト:

POST /services/PTService.svc/Import_CSV HTTP/1.1
Host: inf18
Connection: keep-alive
Content-Length: 565
Origin: http://inf18
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 
Safari/537.11
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykpa0b9lHil712wdL
Accept: */*
Referer: http://inf18/dashboard/ManageRecipient.aspx
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: ASP.NET_SessionId=o50tom0nkjfmglumcmrbtlds

応答:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/csv; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
Content-Disposition: attachment;filename=ImportErrors.csv
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 18 Dec 2012 18:30:37 GMT

IEで使用する場合のヘッダー:(IE9互換ビュー、IE9標準)

リクエスト:

POST /services/PTService.svc/Import_CSV HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-
ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://inf18/dashboard/ManageRecipient.aspx
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR
2.0.50727;     .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; MDDR)
Content-Type: multipart/form-data; boundary=---------------------------7dc180222c0fb0
Accept-Encoding: gzip, deflate
Host: inf18
Content-Length: 598
Connection: Keep-Alive
Pragma: no-cache
Cookie: ASP.NET_SessionId=e2iwodwyy2muxoj4zhpisl5k

応答:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/csv; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
Content-Disposition: attachment;filename=ImportErrors.csv
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 18 Dec 2012 18:33:34 GMT
4

1 に答える 1

1

応答に書き込む前に、次の行を追加しようとしましたか?

/******************************************/
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.Clear();
/******************************************/

HttpContext.Current.Response.ContentType = "text/csv";
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=ImportErrors.csv");
//rest of your code sample
于 2012-12-18T16:49:10.310 に答える