使用EzHttp框架 开发基于HTTP协议的CS轻应用

框架概述

EzHttp是临时起意构思和开发的一个框架,目的在于简化CS轻应用开发过程。开发语言是C#。

普通的基于HTTP的应用开发基本上是RESTful的,客户端调用封装需要人工写代码,就算利用三方库,是不是也要填写一个相对路径。

以前的webservice倒是通过引用的方式编译的时候可以自动生成客户端调用,但服务器必须在线的时候才能更新。

为什么我们不能创建一种优雅的调用方式,比如基于约定的接口。并且这个接口就是C#语言中的interface而不是指一个url地址。

框架使用

设想这样一个例子,

1、有三个项目,分别是服务端,客户端,接口。

2、服务端引用接口项目并实现接口方法。

3、客户端引用接口并通过EzHttp框架的客户端对象获取一个接口的代理对象。

现在,客户端可以通过接口调用方法获取返回的值。这个值就服务端对接口方法实现的类的那个方法返回的值。

于是客户端开发终于如webservice生成引用代理后一般清爽,并且共享接口可以同步更新。

设计思路

通过框架创建客户端代理对象,封装客户端调用为HTTP调用并将返回值做适当处理提供给方法返回值。

框架实现基础是基于已生成的类库中的对象都有唯一的ID。

过程如下:

1、在初始化客户端的调用之前,从服务端获取元数据(包含接口和实现的类型ID映射)。

2、服务端通过反射获取和缓存元数据并返回给客户端。

3、客户端调用接口方法时,框架通过Http封装方法元数据和实参提交给服务器。

4、服务端解析后找到接口实现类,实例化后执行对应的方法,获取返回值后写入Http应答。

5、客户端解析应答和处理调用错误。

高级支持

接口支持设计返回值为Task或Task<T>的方法

提供一个用于传输流的接口,客户端可使用该接口从服务端返回文件等流数据。

为什么提供单独的流传输接口而不使用返回值为byte[]的普通接口方法?

当流长度较大时,普通接口的byte[]数据会完全进入内存,消耗服务器资源。

而独立设计的流传输接口使用缓冲区读写数据。避免了由于流数据过大程序无法处理造成的崩溃或服务器负荷急剧增加。

开发路线图

支持接口依赖注入

支持用于接口实现和接口方法实现的拦截器(筛选器)

代码预览

服务端

 EzHttp.EzServer server = new EzHttp.EzServer();
                server.Start($"http://127.0.01:8000/");

接口:

public interface ITranslateApi
{
/// <summary>
/// 翻译(英译中)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
string Translate(string input);

/// <summary>
/// 翻译(英译中)并提取关键词
/// </summary>
/// <param name="input"></param>
/// <param name="count"></param>
/// <param name="weightOut"></param>
/// <returns></returns>
string TranslateAndGetKeywords(string input, int count, bool weightOut);
}

接口实现:

public class TranslateImpl : EzHttp.EzHandler, ITranslateApi
    {
        public string Translate(string input)
        {
            if (string.IsNullOrEmpty(input))
            {
                throw new Exception("input can not be null");
            }
            return Form1.Instance.Translate(input);
        }

        public string TranslateAndGetKeywords(string input, int count, bool weightOut)
        {
            if (string.IsNullOrEmpty(input))
            {
                throw new Exception("input can not be null");
            }
            var output = Translate(input);
            if (string.IsNullOrEmpty(output))
            {
                throw new Exception("translate result is null.");
            }
            if (!KeyWordExtract.NLPIR_Init(@".\", 0))//给出Data文件所在的路径,注意根据实际情况修改。
            {
                throw new Exception("keyword extraction service init error");
            }
            var ptr = KeyWordExtract.NLPIR_GetKeyWords(output, count, weightOut);
            return Marshal.PtrToStringAnsi(ptr);
        }
    }

客户端调用

EzClient.Initialize("http://127.0.0.1:8000/");
var api = EzClient.ProxyFactory.GetProxy<ITranslateApi>();
api.Translate(System.IO.File.ReadAllText("input.txt"));

参与框架讨论:590883722

时间: 2024-10-28 23:56:12

使用EzHttp框架 开发基于HTTP协议的CS轻应用的相关文章

用c++开发基于tcp协议的文件上传功能

用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学阅读,比 APUE 讲的更深入 这是某个银行广告项目(p2p传输视频)的一部分 IO模型采用的阻塞模式,文件一打开就直接上传 用vc 2003编译,生成win32 dll 麻雀虽小五脏俱全,CSimpleSocket,CReadStream dll 输出一虚类 extern "C" __d

使用Jayrock开源组件开发基于JSON-RPC协议的接口

最近接手一个以前的项目,无意间发现此项目开发接口的组件:Jayrock(接口组件估计用的少,用的最多的估计是这个Jayrock.json.dll,用于解析json) 以下是Jayrock的介绍官网: https://atifaziz.github.io/projects/jayrock/ 如果你在开发上使用了该组件,上面的官网会是一个不错的入门教程. 在研究的过程中,发现Jayrock有以下的特定,主要从开发角度方向进行分析. 优点如下: 1.接口开发和部署简单,直接继承组件的JsonRpcHa

Django框架开发-基于Ajax实现的登录

---恢复内容开始--- 一.需要知道的新知识点 1.刷新验证码,给src属性加一个?号.加个?会重新去请求 # 给验证码刷新 $(".vialdCode_img").click(function () { 方式一:dom方法 $(this)[0].src+="?"#} 方式二:jQuery的attr方法 $(this).attr("src",$(this).attr("src")+'?') }) }) 2.当登录成功跳转,或

基于Http协议订阅发布系统设计

  --物联网系统架构设计   1,订阅发布(subscriber-publisher) 订阅发布模式最典型的应用场景就是消息系统的设计.在消息系统的架构中,消息的发送者称作(publisher),消息的接收者称作(subscriber),参见wikipedia: Publish–subscribe pattern.整个消息系统的架构可以用如下图1来描述: 图1 由图1可知消息系统主要包括3个组件: 发布者,订阅者和消息代理(Broker),而整个消息系统的核心即是Broker,而目前就业务能力

.net平台 基于 XMPP协议的即时消息服务端简单实现

.net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具所以也算是打一个基础吧!如果你还没有了解过XMPP请先阅读附录中链接的文章,本实例是基agsXMPP上开发的,agsXMPP是C#写的支持开源XMPP协议软件,我们可以在agsXMPP上快速构建自已的即时通讯平台,我的这个例子只是修改了服务器端,因为agsXMPP本身自带的服务器端没有实现聊天功能.

IOS基于XMPP协议开发--XMPPFramewok框架(一):基础知识

最近蘑菇街团队的TT的开源,使我对im产生了兴趣,然后在网上找到了XMPPFramework进行学习研究, 并写了以下系列教程供大家参考,有写的不对的地方,请大家多多包涵指正. 目录索引 IOS基于XMPP协议开发--XMPPFramewok框架(一):基础知识 IOS基于XMPP协议开发--XMPPFramewok框架(二):服务器连接 IOS基于XMPP协议开发--XMPPFramewok框架(三):用户注册 IOS基于XMPP协议开发--XMPPFramewok框架(四):用户认证 IOS

MapReduce教程(一)基于MapReduce框架开发&lt;转&gt;

1 MapReduce编程 1.1 MapReduce简介 MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算,用于解决海量数据的计算问题. MapReduce分成了两个部分: 1.映射(Mapping)对集合里的每个目标应用同一个操作.即,如果你想把表单里每个单元格乘以二,那么把这个函数单独地应用在每个单元格上的操作就属于mapping. 2.化简(Reducing)遍历集合中的元素来返回一个综合的结果.即,输出表单里一列数字的和这个任务属于reducing. 你向Ma

一个基于SSM框架开发的高并发电商秒杀Web系统

0 前言 一个基于SSM框架的高并发秒杀系统采用IDEA+Maven+SSM+Mysql+Redis+Jetty.Bootstrap/Jquery开发. 通过这个小项目,理清了基于SSM框架开发Web应用的流程以及常见的避坑方法,并在最后简单采用了Redis缓存以及Mysql Procedure对项目进行了高并发优化. 接下来从DAO层.Service层.Web层开发以及高并发优化4个方面梳理整个项目开发过程. 源码地址https://github.com/Allegr0/seckill 项目准

基于gulp的前端框架开发规范

前端开发及相关规范 - 基于gulp的前端框架开发规范 1.前端开发工具的安装和使用说明 前端开发工具的目录结构 htmlcodeBuilder - v0.9 ├── statics ├── html //静态文件开发 ├── js // 非require引入的js文件 ├── Lib // 第三方JS包 ├── ve_2_1 // ├── css // 样式目录 ├── fonts // bootstrap的图标字体 ├── img // 图片目录 ├── less // less源码 ├──