0

Asp.Net の Web Api を使用してファイル サービスを作成しています。このサービスは、SQL Server からファイル (Css、Excel、Csv など) を取得し、Get 要求に応答して提供します。

私の最初のテスト ケースは、Css ファイル用です。問題は、サーバー側で正しいデータを確認できますが、ブラウザーがデータを取得/デコードすると、結果が壊れてしまうことです。この問題はエンコーディングに関連しているようです。

FireFox の要求/応答ヘッダーは次のとおりです。

ここに画像の説明を入力

FireBug の応答タブをクリックすると、次のように表示されます。

ここに画像の説明を入力

結果は、ASCII が utf8 として表示されているように見えます。これは、FireBug の html ビューです。

ここに画像の説明を入力

上記の例は、ssl を実行している Facebook アプリケーション内の iFrame です。

URL を取得してブラウザーで直接開くと、動作し、Css が正しく表示されます。

ここに画像の説明を入力

要約すると、Facebook アプリ内のタグから Css ファイルを取得すると、ゴミが表示されます (エンコーディングの問題?)。ブラウザから直接取得すると、機能します。

私の CssFormatter MediaTypeFormatter コード:

    public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
    {

        var taskSource = new TaskCompletionSource<object>(); 
        try
        {
            var incomingFile = value as FileRestService.Entity.IFile;

            var ms = new MemoryStream(incomingFile.DataBuffer);

            ms.CopyTo(writeStream);
            ms.Flush();

            taskSource.SetResult(writeStream);

        }
        catch (Exception e) 
        { 
            taskSource.SetException(e); 
        } 
        return taskSource.Task; 

    }

応答ストリームを正しく作成していませんか? 応答ヘッダーでエンコーディングが指定されていないことに気付きました。これは問題ですか?

4

1 に答える 1

0

これを処理する最も簡単な方法は、次の行に沿って何かを書くことです(ここに重要な詳細があります):

public class Formatter : MediaTypeFormatter {
    // TODO override the constructor to add some mappings or some other way for this formatter to be picked up

    // TODO override CanReadType and CanWriteType according to your rules

    public override void SetDefaultContentHeaders(Type t, HttpContentHeaders headers, string mediaType) {
        base.SetDefaultContentHeaders(t, headers, mediaType);
        headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") {
            FileName = "SomeName.ext"
        };
    }

    public override Task WriteToStreamAsync(Type t, object value, Stream s, HttpContentHeaders headers, TransportContext context) {
        return Task.Factory.StartNew(() => {
            // TODO code to write to the output stream, flush it but don't explicitly close it
        });
    }
}
于 2012-08-29T20:29:00.340 に答える