我创建了一个网站(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;
}
}
据我所知,没有服务器或标头设置会限制块大小。有没有办法强制一个小块大小(某种写入后跟一个刷新可能?)。
任何帮助都非常感激。
答案 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屏幕截图
由于