在分块的http响应上设置最大块大小

时间:2015-02-15 15:04:50

标签: c# azure httpresponse transfer-encoding

我创建了一个网站(Azure上的c#),它提供对微控制器的响应(使用德州仪器CC3100 wifi芯片)。

微控制器的内存有限,我想将其缓冲区大小限制在1000字节以下。我可以使用传输编码Chunked(并且它可以工作),但我正在努力解决如何设置最大块大小,因为它似乎设置在“TCP / IP引擎盖下”。

我目前的缩写代码如下: -

    public class HITController : ApiController
{
    public async Task<HttpResponseMessage> Post()
    {
        byte[] RetContent = null;
        byte[] bytes = await Request.Content.ReadAsByteArrayAsync();//do stuff with incoming bytes
        RetContent = responseSelect(SiteSN, inData);//this gets a byte array of content to return
        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result.StatusCode = HttpStatusCode.OK;
        ByteArrayContent ResponseContent = new ByteArrayContent(RetContent);
       result.Content = ResponseContent;
       result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
       result.Headers.TransferEncodingChunked = true;
       return result;
   }
}

据我所知,没有服务器或标头设置会限制块大小。有没有办法强制一个小块大小(某种写入后跟一个刷新可能?)。

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:1)

我在Azure上做类似的事情。我有一个我从CC3100调用的Web API,当我尝试下载文件时,我想限制缓冲区大小。我已经在我的控制器中实现了这一点,当我从Postman调用控制器时看到Wireshark的响应时,我注意到响应很好,数据包的大小从1260变化(它构成了所需的缓冲区)大小为1200字节),为1514字节,包括一个1200字节大小的块和一块下一个块,这是不期望的。甚至更奇怪的是,响应同步为1260字节大小的数据包同步,然后返回到1514大小的数据包,然后回到1260.现在在有人建议使缓冲区更大之前,意识到接收器是一个内存的物联网设备(即缓冲空间)是有限的。顺便说一下,感谢ChunkedStreamContent类的https://stackoverflow.com/users/4391/david-kreps。我修改它以试图将缓冲区大小固定为1200。

    public async Task<HttpResponseMessage> Get(string model, string version)
    {
        try
        {
            // code that get vm removed

            var blobref = HttpUtility.UrlDecode(Path.GetFileName(vm.Url)) ;
            var container = Path.GetFileName(Path.GetDirectoryName(vm.Url));

            HttpContext.Current.Response.Buffer = false;    // turn off buffering
            HttpContext.Current.Response.BufferOutput = false;

            //var ret = await Task.Run(() => _blobService.FetchBlob(blobref, container));
            var resp = new HttpResponseMessage(HttpStatusCode.OK);
            resp.Headers.TransferEncodingChunked = true;
            //resp.Content = new ByteArrayContent(Encoding.UTF8.GetBytes(ret));
            var stream = await Task.Run(() => _blobService.FetchBlobToStream(blobref, container));
            stream.Position = 0;
            resp.Content = new ChunkedStreamContent(stream);

            return resp;

        }
        catch (Exception ex)
        {
            var resp = new HttpResponseMessage(HttpStatusCode.InternalServerError);
            var errmsg = "FirmwareUpdateController - Get - Error: " + ((ex.InnerException == null)
                ? ex.Message
                : ex.Message + " Inner Exception " + ex.InnerException.Message);
            _logger.Error(errmsg);

            resp.Content = new StringContent(errmsg);
            return resp;
        }
    }

public class ChunkedStreamContent : StreamContent
{
    public ChunkedStreamContent(Stream stream)
        : base(stream, 1200) { }

    protected override bool TryComputeLength(out long length)
    {
        length = 0L;
        return false;
    }
}

以下是Wireshark的屏幕截图,显示了响应数据包的漂移情况,

Wireshark屏幕截图

Wireshark screen capture

由于