一、创建切面类
引用圈起来的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; } }