4

マイクロコントローラー (Texas Instruments CC3100 wifi チップを使用) に応答を提供する Web サイト (Azure 上の c#) を作成しました。

マイクロコントローラのメモリは限られているため、バッファ サイズを 1000 バイト未満に制限したいと考えています。Transfer encoding 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;
   }
}

私が見る限り、チャンクサイズを制限するサーバーまたはヘッダー設定はありません。小さなチャンクサイズを強制する方法はありますか (ある種の書き込みに続いてフラッシュが行われる可能性がありますか?)。

どんな助けでも大歓迎です。

4

1 に答える 1

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 の画面キャプチャ

ありがとう

于 2016-01-22T22:00:52.493 に答える