コード例 #1
0
ファイル: ActionFilter.cs プロジェクト: wyh0395/Berry
        /// <summary>
        /// 输出拦截器
        /// </summary>
        /// <param name="actionExecutedContext"></param>
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            if (actionExecutedContext.Exception != null)
            {
                var resultMsg = new BaseJsonResult <string>
                {
                    Status  = (int)JsonObjectStatus.Exception,
                    Message = actionExecutedContext.Exception.Message,
                };

                actionExecutedContext.Response = resultMsg.TryToHttpResponseMessage();
            }
            else
            {
                if (actionExecutedContext.Response.Content == null)
                {
                    var resultMsg = new BaseJsonResult <string>
                    {
                        Status  = (int)JsonObjectStatus.Error,
                        Message = "HTTP响应消息内容为空",
                    };
                    actionExecutedContext.Response = resultMsg.TryToHttpResponseMessage();
                }
                else
                {
                    string result;
                    long   resultLength = 0;
                    if (actionExecutedContext.Response.Content is ObjectContent)
                    {
                        result = ((ObjectContent)actionExecutedContext.Response.Content).Value.ToString();
                    }
                    else
                    {
                        byte[] ctx = actionExecutedContext.Response.Content.ReadAsByteArrayAsync().Result;
                        //resultLength = ctx.LongLength;
                        result = Encoding.UTF8.GetString(ctx);
                    }

                    var Headers        = actionExecutedContext.ActionContext.Request.Headers;
                    var AcceptEncoding = Headers.AcceptEncoding;
                    if (AcceptEncoding != null && AcceptEncoding.Contains(new StringWithQualityHeaderValue("gzip")))
                    {
                        byte[] body           = Encoding.UTF8.GetBytes(result.ToString());
                        byte[] compressedData = GZipHelper.GZipCompress(body);

                        actionExecutedContext.Response.Content = new ByteArrayContent(compressedData);
                        actionExecutedContext.Response.Content.Headers.Remove("Content-Type");
                        actionExecutedContext.Response.Content.Headers.Add("Content-Encoding", "gzip");
                        actionExecutedContext.Response.Content.Headers.Add("Content-Type", "application/json; charset=utf-8");
                    }
                    else if (AcceptEncoding != null && AcceptEncoding.Contains(new StringWithQualityHeaderValue("deflate")))
                    {
                        byte[] body           = Encoding.UTF8.GetBytes(result.ToString());
                        byte[] compressedData = GZipHelper.DeflateCompress(body);

                        actionExecutedContext.Response.Content = new ByteArrayContent(compressedData);
                        actionExecutedContext.Response.Content.Headers.Remove("Content-Type");
                        actionExecutedContext.Response.Content.Headers.Add("Content-Encoding", "deflate");
                        actionExecutedContext.Response.Content.Headers.Add("Content-Type", "application/json; charset=utf-8");
                    }
                    else
                    {
                        actionExecutedContext.Response = result.TryToHttpResponseMessage();
                    }

                    //if (resultLength > 1024)
                    //{

                    //}
                    //else
                    //{
                    //    actionExecutedContext.Response.Content = new StringContent(result.TryToJson(), Encoding.UTF8, "application/json");
                    //}
                }
            }
            base.OnActionExecuted(actionExecutedContext);
        }