簡體   English   中英

在 asp.net mvc 中使用 C# 解壓縮正文請求,已使用 pako 庫 JS 壓縮

[英]Decompress body request with C# in asp.net mvc already compressed with pako library JS

我有一個 asp.net mvc 應用程序,想使用 Pako 庫(使用 gzip 和 deflate 編碼)壓縮視圖中的請求正文,並在使用 OnActionExecuting 和 GZipStream/DeflateStream 到達控制器之前解壓縮正文請求。

為什么要這樣做? 因為我有一個阻止所有請求 > 128KB 的防火牆,所以我在必要時進行壓縮,我已經使用 angular 10 和 .NET Core API 中的另一個應用程序這樣做了,但在 asp.net mvc 中不能做同樣的事情:(

現在我可以壓縮正文並使用 ajax 將其發送到控制器,觸發 OnActionExecuting 但我的代碼不起作用 request.Filtrer 通過但我在模型控制器中有 null 並且 filterContext.ActionParameters.Values 也是 null 。

我用 angular 10 和 API.NET Core 實現了這一點,它工作我在 angular 中使用了 pako,在我的 api 核心中使用了這段代碼:

public async Task Invoke(HttpContext httpContext)
        {
            await SlowStuffSemaphore.WaitAsync();
            try
            {
                _httpContext = httpContext;
                bool isGzip = IsGzipRequest();
                if (isGzip)
                {
                    _httpContext.Request.Body = new GZipStream(_httpContext.Request.Body, CompressionMode.Decompress);
                }

                await _next.Invoke(_httpContext);
            }
            catch(ArgumentNullException e)
            {
                Console.WriteLine("Error: " + e.Message);
            }
            finally
            {
                SlowStuffSemaphore.Release();
            }
        }  

  

我的 ASP.NET MVC 代碼:

看法 :

  <script>
        window.SendZipedRequest = (reqbody) => {
        $.ajax({
        url: "/Home/AddAgency",
        contentType: "application/x-www-form-urlencoded; charset=utf-8",
        type: "post",
        headers: { "Content-Encoding": "gzip" },
        data: pako.gzip(JSON.stringify(reqbody), {to: "string"}),
        beforeSend: function (data) {
        //Do Something
        },
        success: function (data, textStatus, jqXHR) {
        console.log('Yay!');
        //$("#content").html(data);
        },
        error: function (jqXHR, textStatus, errorThrown) {
        console.log('Oh no!');
        },
        complete: function (jqXHR, textStatus) {
        console.log(textStatus);
        console.log(jqXHR.status);
        //console.log(jqXHR.responseText);
        }
        });
        }
    </script>

動作過濾器屬性:

public class CompressContentAttribute : ActionFilterAttribute
{
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    HttpRequestBase request = filterContext.HttpContext.Request;
    request.Filter = new GZipStream(request.Filter, CompressionMode.Decompress);
    base.OnActionExecuting(filterContext);
 }
}

另一個問題我有它是 HttpContext.Request.InputStream (流包含我的身體)它是只讀的

謝謝

.NET 7 Preview 6開始,ASP.NET Core 中添加了一個新的中間件,它使用 Content-Encoding HTTP 標頭自動識別和解壓縮帶有壓縮內容的請求,這樣服務器的開發人員就不需要自己處理這個問題。 使用IApplicationBuilder UseRequestDecompression方法和IServiceCollection上的AddRequestDecompression擴展方法添加請求解壓中間件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM