3

jQuery を使用して WCF サービスを呼び出して、CSV ファイルをリモートでダウンロードしようとしています。ファイルは実際にはサーバー上に存在しないため、ストリームとして返そうとしています。ヘッダーを使用しているためContent-Disposition、クライアントのブラウザーは、指定されたファイル名でファイルのダウンロードを自動的に開始する必要があります。

C# での私の WCF サービス メソッド:

[OperationContract()]
public Stream GetCsvFile(int id)
{
    string s = ...;
    WebOperationContext.Current.OutgoingResponse.ContentType = "text/csv";
    WebOperationContext.Current.OutgoingResponse.Headers["Content-Disposition"] = "attachment; filename=\"file1.csv\"";
    return GenerateStreamFromString(s);
}

public Stream GenerateStreamFromString(string s)
{
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(s);
    writer.Flush();
    stream.Position = 0;
    return stream;
}

私のjQuery AJAXリクエスト:

$.ajax({
    type: "POST",
    url: serviceUrl,
    cache: false,
    data: data,
    dataType: "text",
    contentType: "application/json; charset=utf-8",
    success: function() {
        // TODO...
    }
});

このリクエストは正常に完了しました。そして、応答で正しい CSV データを確認できます。ただし、ブラウザで実際の「ファイル ダウンロード」アクションを開始することはなく (現時点では Chrome でテスト中)、「file1.csv」はクライアントのディスクに保存されません。

同じアプリケーションの古い VB.NET バージョンでは、.aspx ページのコード ビハインドで次のように動作しました。

Response.Clear()
Response.ContentType = "text/csv"
Response.AddHeader("content-disposition", "attachment; filename="file1.csv")
Response.Write(s)
Response.End()

これにより、「file1.csv」のファイル ダウンロードが自動的に開始されます。「名前を付けて保存」ダイアログも表示されず、ファイルはすぐにダウンロードされます。とてもかっこよかったです。

では、jQuery で WCF サービスを呼び出そうとすると、なぜうまくいかないのでしょうか?

4

1 に答える 1

0

サーバー側で適切な ContentType を指定する必要があります

于 2013-08-21T07:11:44.063 に答える