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