4

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

微控制器的内存有限,我想将其缓冲区大小限制在 1000 字节以下。我可以使用传输编码块(并且它有效),但我正在努力解决如何设置最大块大小,因为它似乎设置为“在 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;
   }
}

据我所知,没有服务器或标头设置会限制块大小。是否有某种方法可以强制使用小块大小(可能是某种写入,然后是刷新?)。

非常感谢任何帮助。

4

1 回答 1

1

我在 Azure 上做类似的事情。我有一个从 CC3100 调用的 Web API,在尝试下载文件时,我想限制缓冲区大小。我已经在我的控制器中实现了这一点,当我从 Postman 调用控制器时使用 Wireshark 查看响应时,我注意到在响应中,数据包的大小从 1260 变化(帧所需的缓冲区大小为1200 字节),到 1514 字节,其中包括一个 1200 字节大小的块和一块下一个块,这不是预期的。更奇怪的是,响应在 1260 字节大小的数据包上同步了几个,然后回到 1514 大小的数据包,然后回到 1260。现在在有人建议扩大缓冲区之前,请意识到接收器是一个物联网设备,其中内存(即缓冲区空间)是有限的。顺便说一句,感谢https://stackoverflow.com/users/4391/david-kreps对于 ChunkedStreamContent 类。我对其进行了修改,试图将缓冲区大小固定为 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 屏幕截图

谢谢

于 2016-01-22T22:00:52.493 回答