.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;
}
}

浙公网安备 33010602011771号