/// <summary>
/// 调用Web API
/// </summary>
public class InvokeMVCWebAPI
{
/// <summary>
/// 如果ErrorCode不是成功直接抛出异常
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="method"></param>
/// <param name="url"></param>
/// <param name="soaLoginRequest"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static SOAResponse<T> InvokeMvcWebApi<T>(
HttpMethod method,
string url,
SOALoginRequest soaLoginRequest = null,
object obj = null, int Timeout_seconds = 600)
{
if (soaLoginRequest == null)
{
soaLoginRequest = new SOALoginRequest
{
UserCookie =
LoginHelper.GetLoginCookieValue,
AppId = UtilVar.AppId,
AppSecrect = UtilVar.AppSecret
};
}
if (string.IsNullOrWhiteSpace(soaLoginRequest.UserCookie))
soaLoginRequest.UserCookie = LoginHelper.GetLoginCookieValue; return HttpWebRequestGetPost<T>(method, url, soaLoginRequest, obj, Timeout_seconds: Timeout_seconds); } //private static object async_object = new object(); /// <summary>
/// 同步方法 超时20分钟
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="method"></param>
/// <param name="url"></param>
/// <param name="soaLoginRequest"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static SOAResponse<T> HttpWebRequestGetPost<T>(HttpMethod method,
string url,
SOALoginRequest soaLoginRequest,
object obj = null, int Timeout_seconds = 600)
{
string jsonObj = "";
if (obj != null)
jsonObj = JSON.SerializeAllField(obj); var returnObj = new SOAResponse<T>
{
Body = default(T)
};
var req = (HttpWebRequest)HttpWebRequest.Create(url);
var encoding = Encoding.UTF8;
req.Accept = "application/json"; req.Headers.Add("X_31HuiYi_LoginCookie", soaLoginRequest.UserCookie);
//string appStr = LoginHelper.SetAppRequest(method, UtilVar.UrlDecode(url), soaLoginRequest);
string appStr = LoginHelper.SetAppRequest(method, url, soaLoginRequest);
req.Headers.Add("X_31HuiYi_AppAuth", appStr);
//设置没有缓存
req.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
req.Timeout = Timeout_seconds * 1000;
string responseData = String.Empty;
req.Method = method.ToString(); req.ContentType = "application/json"; byte[] bs = null;
if (req.Method == "POST" || req.Method == "PUT")
{
if (obj != null)
{
bs = encoding.GetBytes(jsonObj);
req.ContentLength = bs.Length;
}
else
req.ContentLength = 0; using (Stream reqStream = req.GetRequestStream())
{
if (obj != null)
reqStream.Write(bs, 0, bs.Length);
reqStream.Close();
}
} try
{
using (HttpWebResponse response = (HttpWebResponse)req.GetResponse())
{
using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
{
responseData = reader.ReadToEnd().ToString();
returnObj = JSON.Deserialize<SOAResponse<T>>(responseData);
if (response.IsFromCache)
throw new Exception("不能进行缓存--scofi");
Console.WriteLine("成功");
return returnObj;
}
}
}
catch (Exception e)
{
returnObj.Body = default(T); returnObj.Code = ErrorCode.未知错误;
returnObj.AddDefaultMessage("发生未捕捉的异常:" + e.ToString() + " source=" + e.Source + " e.InnerException=" + (e.InnerException == null ? "" : e.InnerException.ToString()));
Console.WriteLine("发生未捕捉的异常:" + e.ToString() + " source=" + e.Source + " e.InnerException=" + (e.InnerException == null ? "" : e.InnerException.ToString())); // string msg = "发生未捕捉的异常:" + e.ToString() + " source=" + e.Source + " e.InnerException=" + (e.InnerException == null ? "" : e.InnerException.ToString()); //if (string.IsNullOrWhiteSpace(e.Message) == false && e.Message.Contains("(404)"))
//{
// LogHelper.Log(LogType.Error, 123, 123, "req.Method= " + req.Method.ToString() + ", url=" + url + " ,msg=" + msg, tags: new List<string>() { "404路由错误" });
//}
//else if (string.IsNullOrWhiteSpace(e.Message) == false && e.Message.Contains("(405)"))
//{
// LogHelper.Log(LogType.Error, 123, 123, "req.Method= " + req.Method.ToString() + ", url=" + url + " ,msg=" + msg, tags: new List<string>() { "405路由method错误" });
//}//远程服务器返回错误: (405) 不允许的方法。 //mongoDB 查询语法:{"Tags":{"$in":["404路由错误","405路由method错误"]}}
return returnObj;
} } /// <summary>
/// 会设置AppAuth
/// </summary>
/// <param name="method"></param>
/// <param name="url"></param>
/// <param name="soaLoginRequest"></param>
/// <param name="content"></param>
/// <returns></returns>
private static HttpRequestMessage GetReqeustMessage(HttpMethod method, string url,
SOALoginRequest soaLoginRequest, JsonHttpContent content = null)
{
var uri = new Uri(url);
var msg = new HttpRequestMessage(method, uri);
if (content != null) msg.Content = content;
msg.Headers.Add("X_31HuiYi_AppAuth", LoginHelper.SetAppRequest(method, url, soaLoginRequest)); return msg;
} }
SOAResponse
using Newtonsoft.Json;
using System;
using System.Collections.Generic; namespace HYService.Util
{
/// <summary>
/// SOA 响应
/// </summary>
/// <typeparam name="T"></typeparam>
[Serializable, JsonObject(MemberSerialization.OptOut)]
public class SOAResponse<T>
{
/// <summary>
///
/// </summary>
public SOAResponse()
{
Code = ErrorCode.成功;
Message = new Dictionary<string, string>();
} /// <summary>
/// 成功,失败通用的一个错误提示信息; 只能添加一次(否则字典抛出异常)
/// </summary>
/// <param name="defaultMessage"></param>
public void AddDefaultMessage(string defaultMessage)
{
if (Message.ContainsKey("defaultMessage") == false)
{
Message.Add("defaultMessage", defaultMessage);
}
else
Message["defaultMessage"] = Message["defaultMessage"] + "; " + defaultMessage; ;
} /// <summary>
/// 获取设置默认值
/// </summary>
/// <returns></returns>
public string DefaultMessage
{
get
{
if (Message.ContainsKey("defaultMessage"))
{
return Message["defaultMessage"];
}
return string.Empty;
} set
{
if (Message.ContainsKey("defaultMessage") == false)
Message.Add("defaultMessage", value);
else
Message["defaultMessage"] = value;
}
} /// <summary>
/// 添加消息
/// </summary>
/// <param name="key"></param>
/// <param name="message"></param>
/// <returns></returns>
public bool AddMessage(string key, string message)
{
if (Message.ContainsKey(key) == false)
{
Message.Add(key, message);
return true;
}
else
{
Message[key] += "," + message;
}
return false;
} /// <summary>
/// 0 表示成功, (默认成功) 负数表示程序抛出异常; 正数表示业务规则不符合要求
/// </summary>
public ErrorCode Code { get; set; } /// <summary>
/// 失败(成功)的描述信息; 添加时候请调用 AddMessage;而不是直接操作字典
/// </summary>
public Dictionary<string, string> Message { get; set; } /// <summary>
/// 生成成功响应
/// </summary>
/// <param name="body"></param>
/// <returns></returns>
public static SOAResponse<T> MakeSucc(T body)
{
return new SOAResponse<T>
{
Code = ErrorCode.成功,
Body = body
};
} /// <summary>
/// 创建失败
/// </summary>
/// <param name="err"></param>
/// <returns></returns>
[Obsolete]
public static SOAResponse<T> MakeFailed(ErrorCode err = ErrorCode.未知错误)
{
return CreateFailed("未知错误", err);
} /// <summary>
/// 设置为失败
/// </summary>
/// <param name="defaultMessage"></param>
/// <param name="errorCode"></param>
public SOAResponse<T> Fail(string defaultMessage = "失败!", ErrorCode errorCode = ErrorCode.未知错误)
{
Code = errorCode;
AddDefaultMessage(defaultMessage);
return this;
} /// <summary>
/// 创建一个失败
/// </summary>
/// <param name="defaultMessage"></param>
/// <param name="errorCode"></param>
/// <returns></returns>
public static SOAResponse<T> CreateFailed(string defaultMessage = "失败!", ErrorCode errorCode = ErrorCode.未知错误)
{
var response = new SOAResponse<T>();
response.Fail(defaultMessage, errorCode);
return response;
} /// <summary>
/// 是否成功
/// </summary>
/// <returns></returns>
public bool IsOk()
{
return this.Code == ErrorCode.成功;
} /// <summary>
/// 返回的对象(主要是让 JSON 序列化 返回的参数在后面)
/// </summary>
public T Body;
} /// <summary>
///
/// </summary>
public enum ErrorCode
{
/// <summary>
/// 程序异常
/// </summary>
程序异常 = -2,
/// <summary>
///
/// </summary>
授权失败 = -1, /// <summary>
/// 成功
/// </summary>
成功 = 0, /// <summary>
///
/// </summary>
未知错误 = 1, }
直接调用
if (string.IsNullOrWhiteSpace(info.JsonPOSTData) == false)
{
dynamic d = JSON.Deserialize<dynamic>(info.JsonPOSTData);
result = InvokeMVCWebAPI.InvokeMvcWebApi<bool>(System.Net.Http.HttpMethod.Post, info.PostURL, null, d, timeoutsecond);
}
else
{
result = InvokeMVCWebAPI.InvokeMvcWebApi<bool>(System.Net.Http.HttpMethod.Post, info.PostURL, Timeout_seconds: timeoutsecond);
}
info.ErrorMessages.Add(JSON.SerializeAllField(result));