微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在已经用pako库JS压缩过的asp.net mvc中用C#解压缩主体请求

如何解决在已经用pako库JS压缩过的asp.net mvc中用C#解压缩主体请求

我有一个asp.net mvc应用程序,想要使用Pako库在视图中压缩请求的主体(使用gzip和deflate编码),并在使用OnActionExecuting和GZipStream / DeflateStream到达控制器之前解压缩主体请求。 / p>

为什么要这样做?因为我的防火墙阻止了所有大于128KB的请求,所以我在必要时进行压缩,我已经使用angular 10和.NET Core API中的另一个应用程序进行了此操作,但是在asp.net mvc中无法做同样的事情:(>

现在我可以压缩主体并使用ajax将其发送到控制器,触发了OnActionExecuting,但是我的代码无法正常工作。通过过滤器,但是我在模型控制器中具有null并且filterContext.ActionParameters.Values也为null

我用angular 10和API.NET Core做到了这一点,并且在我的api核心中使用了pako并使用了这段代码

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,errorThrown) {
        console.log('Oh no!');
        },complete: function (jqXHR,textStatus) {
        console.log(textStatus);
        console.log(jqXHR.status);
        //console.log(jqXHR.responseText);
        }
        });
        }
    </script>

ActionFilterattribute:

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(流包含我的身体),它是只读的

谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。