.net webapi切面客户端类(微服务)

一、创建切面类

引用圈起来的2个类库,从nuget里面找。

ApiClientAttribute.cs

    [Serializable]
    public class ApiClientAttribute : PostSharp.Aspects.OnMethodBoundaryAspect
    {
        private string _Route { get; set; }
        private string _Url { get; set; }
        public ApiClientAttribute(string route, string url)
        {
            _Route = route;
            _Url = url;
        }

        public override void OnExit(MethodExecutionArgs args)
        {
            //获取使用者的入参
            string postData;
            if (args.Arguments.Count > 0)
            {
                postData = JsonConvert.SerializeObject(args.Arguments[0]);
            }
            else
            {
                postData = "{}";
            }
            //请求数据并改变出参
            string result = _WebRequest(_Url + _Route, postData);
            try
            {
                ReturnMsg<object> resultObj = JsonConvert.DeserializeObject<ReturnMsg<object>>(result);
                if (resultObj.Code == 1)
                {
                    if (resultObj.Value != null)
                    {
                        Type returnType = (args.Method as MethodInfo)?.ReturnType;
                        if (resultObj.Value.GetType().IsValueType || resultObj.Value is string)
                        {
                            args.ReturnValue = Convert.ChangeType(resultObj.Value, returnType);
                        }
                        else
                        {
                            var jt = (JToken)resultObj.Value;
                            args.ReturnValue = jt?.ToObject(returnType);
                        }
                    }
                    else
                    {
                        args.ReturnValue = null;
                    }
                }
                else
                {
                    //log:_Url,_Route,postData
                    throw new Exception(resultObj.Description);
                }
            }
            catch (Exception ex)
            {
                //log:ex
            }

            base.OnExit(args);
        }

        public string _WebRequest(string url, string postData, Method method = Method.POST)
        {
            HttpWebRequest httpWebRequest = null;
            StreamWriter streamWriter = null;
            StreamReader streamReader = null;
            string result = null;
            //请求对象设置
            httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            httpWebRequest.ServicePoint.ConnectionLimit = 10000;
            httpWebRequest.Method = method.ToString();
            httpWebRequest.Accept = "*/*";
            httpWebRequest.Headers.Add("Accept-Language", "zh-cn");
            httpWebRequest.UserAgent = "API Client";
            httpWebRequest.ContentType = "application/json";
            //请求数据
            if (method == Method.POST)
            {
                try
                {
                    streamWriter = new StreamWriter(httpWebRequest.GetRequestStream());
                    streamWriter.Write(postData);
                }
                catch
                {
                    httpWebRequest.Abort();
                    httpWebRequest = null;
                    throw;
                }
                finally
                {
                    if (streamWriter != null)
                    {
                        streamWriter.Close();
                        streamWriter = null;
                    }
                }
            }
            //响应数据
            try
            {
                streamReader = new StreamReader(httpWebRequest.GetResponse().GetResponseStream());
                result = streamReader.ReadToEnd();
            }
            catch
            {
                throw;
            }
            finally
            {
                if (streamReader != null)
                {
                    streamReader.Close();
                    streamReader = null;
                }
                httpWebRequest.Abort();
                httpWebRequest = null;
            }
            return result;
        }

        public enum Method
        {
            GET,
            POST,
            PUT,
            DELETE
        }

    }

二、切面类的使用

DefaultClient.cs

    public class DefaultClient
    {
        [ApiClient("/Default/GetNum", "http://127.0.0.1")]
        public int GetNum()
        {
            //如果有入参,请把入参放到一个对象
            return 0;
        }
    }

  

猜你喜欢

转载自www.cnblogs.com/by-lhc/p/9760273.html