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

时间:2022-11-08 12:51:14

框架概述

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

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

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

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

服务端和客户端引用接口DLL共享接口信息,通过一个中间框架在客户端和服务器之间构建Http请求和应答。基于此构想,EzHttp项目诞生。

框架使用

设想这样一个例子,

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(@".\", ))//给出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

框架下载:下载EzHttp

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

  1. 用c&plus;&plus;开发基于tcp协议的文件上传功能

    用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...

  2. Loadrunner脚本开发-基于HTTP协议的流媒体视频在线播放服务器性能测试

    脚本开发-基于HTTP协议的流媒体视频在线播放服务器性能测试 by:授客 QQ:1033553122   目的 实现基于http协议的流媒体在线视频播放,服务器性能测试脚本,模拟用户浏览器方式在线播放 ...

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

    最近接手一个以前的项目,无意间发现此项目开发接口的组件:Jayrock(接口组件估计用的少,用的最多的估计是这个Jayrock.json.dll,用于解析json) 以下是Jayrock的介绍官网: ...

  4. python开发基于SMTP协议的邮件代发服务

    写在这篇文章前照例给大家灌输点名词解释,理论知识,当然已经很熟悉的同学可以往下翻直接看干货 1. 什么是SMTP SMTP即简单传输协议(Simple Mail Transfer Protocol), ...

  5. 转自fineui论坛:解决fineui框架开发中的Designer&period;aspx&period;cs丢失问题

    在开发的时候碰到个问题,本来好好的Edit.aspx  Edit.aspx.cs  Edit.Designer.aspx.cs编辑Edit.aspx然后保存,编译的时候 发现Edit.aspx.cs里 ...

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

      基于Http协议订阅发布系统设计 --物联网系统架构设计   1,订阅发布(subscriber-publisher)      订阅发布模式最典型的应用场景就是消息系统的设计.在消息系统的架构中 ...

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

    .net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具 ...

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

    最近蘑菇街团队的TT的开源,使我对im产生了兴趣,然后在网上找到了XMPPFramework进行学习研究, 并写了以下系列教程供大家参考,有写的不对的地方,请大家多多包涵指正. 目录索引 IOS基于X ...

  9. workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)

    workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的) 一.总结 1.下面链接里面还有一个来聊的php聊天室源码可以学习 2. ...

随机推荐

  1. TCP&sol;IP协议三次握手与四次握手流程解析

    原文链接地址:http://www.2cto.com/net/201310/251896.html TCP/IP协议三次握手与四次握手流程解析 TCP/IP协议的详细信息参看<TCP/IP协议详 ...

  2. Docker version 1&period;12&period;5建立registry私库

    sudo docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry :前面的是宿主机的地址(/opt/da ...

  3. sql行列旋转

    一,行转列 先建立测试数据 if OBJECT_ID('week_income') is not null drop table week_income go create table week_in ...

  4. windows 7 32bit安装 python3&period;5&period;0 安装错误 0x80240017 -未指定错误

    日志显示如下: [0F60:03D4][2015-10-20T10:47:52]i001: Burn v3.10.0.1823, Windows v6.1 (Build 7600: Service P ...

  5. 解决duilib使用zip换肤卡顿的问题:修改duilib并使用资源文件换肤

    转载请说明原出处,谢谢~~ 今天在做单子是,客户要求做换肤功能,为此我专门写了一个换肤函数,并且把各种皮肤资源压缩为各个zip文件来换肤.但是客户反映程序运行缓慢,我测试后发现的确明显可以看出慢了不少 ...

  6. redis安装及数据类型简介&lpar;string、list、set、sorted&lowbar;set、hash&rpar;

    一:简介: redis国内最大的案例--->新浪微博 memcache:是key-value数据库 数据类型:只支持key value数据 过期策略:支持 持久化:不支持(可以通过三方程序) 主 ...

  7. Asp&period;Net Core SignalR 用泛型Hub优雅的调用前端方法及传参

    继续学习 最近一直在使用Asp.Net Core SignalR(下面成SignalR Core)为小程序提供websocket支持,前端时间也发了一个学习笔记,在使用过程中稍微看了下它的源码,不得不 ...

  8. Git Gui for Windows的建库、克隆(clone)、上传(push)、下载(pull)、合并&lpar;转&rpar;

    Git Gui for Windows的建库.克隆(clone).上传(push).下载(pull).合并(转) from:http://hi.baidu.com/mvp_xuan/blog/item ...

  9. Mybatis的mapper文件中&num;和&dollar;的区别 以及 resultType和resultMap的区别

    一般#{}用于传递查询的参数,一般用于从dao层传递一个string或者其他的参数过来,mybatis对这个参数会进行加引号的操作,将参数转变为一个字符串. SELECT * FROM employe ...

  10. Java——安全地停止线程

    错误用例 下面用例中,一个正在sleep的线程,在调用interrupt后,wait方法检查到isInterrupted()为true,抛出异常, 而catch到异常后没有处理.一个抛出了Interr ...