网页API返回文本文件的垃圾,除非从浏览器中奔跑吧(Web Api returns garbage

2019-11-01 01:17发布

我写使用Asp.Net的Web API文件服务。 该服务检索从SQL Server文件(CSS时,Excel,CSV等)和响应GET请求提供他们。

我的第一个测试用例是CSS文件。 问题是,虽然我可以看到在服务器端,正确的数据当浏览器检索/解码,结果是错位。 这个问题似乎是相关的编码。

下面是在FireFox请求/响应标头:

当我点击萤火响应选项卡上,这里是什么样子:

结果看起来像被显示为UTF8 ASCII。 这是在Firebug的HTML视图:

上述例子是运行SSL Facebook应用程序内的iFrame。

如果我参加了网址,并直接在浏览器中打开它,它的工作原理和正确显示我的CSS:

总之,当我检索标签我的CSS文件,我的Facebook应用程序里面,我得到的垃圾(编码问题?)。 如果我从浏览器直接检索它,它的工作原理。

我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; 

    }

我在创建响应流是否有误? 我注意到,响应头不指定编码。 这是一个问题?

Answer 1:

我觉得处理这个最简单的方法是写沿行(这里是重要的细节)的东西:

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
        });
    }
}


文章来源: Web Api returns garbage for text files unless run from the browser bar