开源组件websocket-sharp中基于webapi的httpserver使用体验
一、背景
因?yàn)樾枰鼋鸬鸈RP的二次開(kāi)發(fā),金蝶ERP的開(kāi)放性真是不錯(cuò),但是二次開(kāi)發(fā)金蝶一般使用引用BOS.dll的方式,這個(gè)dll對(duì)newtonsoft.json.dll這個(gè)庫(kù)是強(qiáng)引用,必須要用4.0版本,而asp.net mvc的webapi client對(duì)newtonsoft.json.dll的最低版本是6.0.這樣就不能用熟悉的webapi client開(kāi)發(fā)了。金蝶ERP據(jù)說(shuō)支持無(wú)dll引用方式,標(biāo)準(zhǔn)的webapi方式,但官方支持有限,網(wǎng)上的文檔也有限且參考意義不大。所以最后把目光聚集在自建簡(jiǎn)單httpserver上,最好是用.net 4作為運(yùn)行時(shí)。在此感謝“C#基于websocket-sharp實(shí)現(xiàn)簡(jiǎn)易httpserver(封裝)”作者的分享,了解到這個(gè)開(kāi)源組件。
二、定制和修改
- 1、修改“注入控制器到IOC容器”的方法適應(yīng)現(xiàn)有項(xiàng)目的解決方案程序集劃分
- 2、修改“響應(yīng)HttpPost請(qǐng)求”時(shí)方法參數(shù)解析和傳遞方式,增加了“FromBoby”自定義屬性來(lái)標(biāo)記參數(shù)是個(gè)數(shù)據(jù)傳輸對(duì)象。
- 3、擴(kuò)展了返回值類(lèi)型,增加了HtmlResult和ImageResult等類(lèi)型
代碼:
? ? ?? 1)、修改“注入控制器到IOC容器”的方法
/// <summary>/// 注入控制器到IOC容器/// </summary>/// <param name="builder"></param>public void InitController(ContainerBuilder builder){Assembly asb = Assembly.Load("Business.Controller");if (asb != null){var typesToRegister = asb.GetTypes().Where(type => !string.IsNullOrEmpty(type.Namespace)).Where(type => type.BaseType == typeof(ApiController) || type.BaseType.Name.Equals("K3ErpBaseController"));if (typesToRegister.Count() > 0){foreach (var item1 in typesToRegister){builder.RegisterType(item1).PropertiesAutowired();foreach (var item2 in item1.GetMethods()){IExceptionFilter _exceptionFilter = null;foreach (var item3 in item2.GetCustomAttributes(true)){Attribute temp = (Attribute)item3;Type type = temp.GetType().GetInterface(typeof(IExceptionFilter).Name);if (typeof(IExceptionFilter) == type){_exceptionFilter = item3 as IExceptionFilter;}}MAction mAction = new MAction(){RequestRawUrl = @"/" + item1.Name.Replace("Controller", "") + @"/" + item2.Name,Action = item2,TypeName = item1.GetType().Name,ControllerType = item1,ParameterInfo = item2.GetParameters(),ExceptionFilter = _exceptionFilter};dict.Add(mAction.RequestRawUrl, mAction);}}}}container = builder.Build();}
2)、修改“響應(yīng)HttpPost請(qǐng)求”時(shí)方法參數(shù)解析和傳遞方式,增加了“FromBoby”自定義屬性;增加了HtmlResult和ImageResult等類(lèi)型
/// <summary>/// 響應(yīng)HttpPost請(qǐng)求/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Httpsv_OnPost(object sender, HttpRequestEventArgs e){MAction requestAction = new MAction();string content = string.Empty;try{byte[] binaryData = new byte[e.Request.ContentLength64];content = Encoding.UTF8.GetString(GetBinaryData(e, binaryData));string action_name = string.Empty;if (e.Request.RawUrl.Contains("?")){int index = e.Request.RawUrl.IndexOf("?");action_name = e.Request.RawUrl.Substring(0, index);}elseaction_name = e.Request.RawUrl;if (dict.ContainsKey(action_name)){requestAction = dict[action_name];object first_para_obj;object[] para_values_objs = new object[requestAction.ParameterInfo.Length];//沒(méi)有參數(shù),默認(rèn)為空對(duì)象if (requestAction.ParameterInfo.Length == 0){first_para_obj = new object();}else{int para_count = requestAction.ParameterInfo.Length;for (int i = 0; i < para_count; i++){var para = requestAction.ParameterInfo[i];if (para.GetCustomAttributes(typeof(FromBodyAttribute), false).Any()){//反序列化Json對(duì)象成數(shù)據(jù)傳輸對(duì)象var dto_object = para.ParameterType;para_values_objs[i] = JsonConvert.DeserializeObject(content, dto_object);}else{//參數(shù)含有FromBodyAttribute的只能有一個(gè),且必須是第一個(gè)int index = e.Request.RawUrl.IndexOf("?");if (e.Request.RawUrl.Contains("&")){bool existsFromBodyParameter = false;foreach (var item in requestAction.ParameterInfo){if (item.GetCustomAttributes(typeof(FromBodyAttribute), false).Any()){existsFromBodyParameter = true;break;}}string[] url_para = e.Request.RawUrl.Substring(index + 1).Split("&".ToArray(), StringSplitOptions.RemoveEmptyEntries);if (existsFromBodyParameter)para_values_objs[i] = url_para[i - 1].Replace(para.Name + "=", "");elsepara_values_objs[i] = url_para[i].Replace(para.Name + "=", "");}else{para_values_objs[i] = e.Request.RawUrl.Substring(index + 1).Replace(para.Name + "=", "");}}}}var action = container.Resolve(requestAction.ControllerType);var action_result = requestAction.Action.Invoke(action, para_values_objs);if (action_result == null){e.Response.StatusCode = 204;}else{e.Response.StatusCode = 200;if (requestAction.Action.ReturnType.Name.Equals("ApiActionResult")){e.Response.ContentType = "application/json";byte[] buffer = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(action_result));e.Response.WriteContent(buffer);}if (requestAction.Action.ReturnType.Name.Equals("agvBackMessage")){e.Response.ContentType = "application/json";byte[] buffer = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(action_result));e.Response.WriteContent(buffer);}else if (requestAction.Action.ReturnType.Name.Equals("HtmlResult")){HtmlResult result = (HtmlResult)action_result;e.Response.ContentType = result.ContentType;byte[] buffer = result.Encoder.GetBytes(result.Content);e.Response.WriteContent(buffer);}else if (requestAction.Action.ReturnType.Name.Equals("ImageResult")){ImageResult apiResult = (ImageResult)action_result;e.Response.ContentType = apiResult.ContentType;byte[] buffer = Convert.FromBase64String(apiResult.Base64Content.Split(",".ToArray(), StringSplitOptions.RemoveEmptyEntries).LastOrDefault());e.Response.WriteContent(buffer);}else{byte[] buffer = Encoding.UTF8.GetBytes(action_result.ToString());e.Response.WriteContent(buffer);}}}else{e.Response.StatusCode = 404;}}catch (Exception ex){if (requestAction.ExceptionFilter == null){byte[] buffer = Encoding.UTF8.GetBytes(ex.Message + ex.StackTrace);e.Response.WriteContent(buffer);e.Response.StatusCode = 500;}else{if (requestAction.ExceptionFilter != null){if (ex.InnerException != null){requestAction.ExceptionFilter.OnException(ex.InnerException, e);}else{requestAction.ExceptionFilter.OnException(ex, e);}}}}}
三、體驗(yàn)概述
- 1、穩(wěn),可用性很高,簡(jiǎn)單直接。
- 2、使用之后對(duì)mvc的底層理解提高很多。
- 3、對(duì)Autofac等IOC容器有了新的認(rèn)識(shí),項(xiàng)目里大量使用了屬性注入方式來(lái)解除耦合。
四、一些截圖
轉(zhuǎn)載于:https://www.cnblogs.com/datacool/p/websocket-sharp.html
總結(jié)
以上是生活随笔為你收集整理的开源组件websocket-sharp中基于webapi的httpserver使用体验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 假山多少钱啊?
- 下一篇: 吴裕雄 Bootstrap 前端框架开发