Facebook Web Api返回文本文件的垃圾,除非从浏览器栏运行

Facebook Web Api返回文本文件的垃圾,除非从浏览器栏运行,facebook,asp.net-mvc-4,asp.net-web-api,Facebook,Asp.net Mvc 4,Asp.net Web Api,我正在使用Asp.Net的Web Api编写一个文件服务。该服务从SQLServer检索文件(Css、Excel、Csv等),并响应Get请求提供这些文件 我的第一个测试用例是Css文件。问题是,虽然我可以在服务器端看到正确的数据,但当浏览器检索/解码数据时,结果会被破坏。问题似乎与编码有关 以下是FireFox中的请求/响应标题: 当我单击FireBug中的响应选项卡时,它看起来是这样的: 结果看起来像ascii,显示为utf8。这是FireBug中的html视图: 上面的示例是运行ss

我正在使用Asp.Net的Web Api编写一个文件服务。该服务从SQLServer检索文件(Css、Excel、Csv等),并响应Get请求提供这些文件

我的第一个测试用例是Css文件。问题是,虽然我可以在服务器端看到正确的数据,但当浏览器检索/解码数据时,结果会被破坏。问题似乎与编码有关

以下是FireFox中的请求/响应标题:

当我单击FireBug中的响应选项卡时,它看起来是这样的:

结果看起来像ascii,显示为utf8。这是FireBug中的html视图:

上面的示例是运行ssl的Facebook应用程序中的iFrame

如果我获取url并直接在浏览器中打开它,它将正常工作并正确显示我的Css:

总之,当我从Facebook应用程序中的标签检索Css文件时,我会收到垃圾(编码问题?)。如果我直接从浏览器中检索它,它就会工作

我的CSS格式化程序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; 

    }
public override Task WriteToStreamAsync(类型、对象值、流writeStream、HttpContent内容、TransportContext TransportContext)
{
var taskSource=new TaskCompletionSource();
尝试
{
var incomingFile=作为FileRestService.Entity.IFile的值;
var ms=新的内存流(incomingFile.DataBuffer);
CopyTo女士(writeStream);
弗拉什女士();
taskSource.SetResult(writeStream);
}
捕获(例外e)
{ 
taskSource.SetException(e);
} 
返回taskSource.Task;
}

我是否错误地创建了响应流?我注意到响应头没有指定编码。这是一个问题吗?

我发现处理这个问题最简单的方法是按照以下内容写一些东西(以下是重要的细节):


如果返回的文件不是附件,是否需要设置ContentDisposition?这些文件通常是Css文件,在呈现页面时由浏览器获取。您可能不需要显式设置处置标头,但可能需要确保内容标头设置正确。
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
        });
    }
}