在Electron+HTML做界面,C#做后台(四)中,我们已经实现了前后端的数据交互,奈何,如果后端返回数据字符过长,就回导致前端接受失败,因此,我们需要加入 【winform http服务
】当然它的作用就很简单了,只需要监听固定端口,获取请求的url即可。
创建 http服务 ,类似的文章有很多,可以百度,这里只介绍简单的做法
1.创建HttpServices.cs
类,并加入一下内容,并且调用上片文章创建的反射方法
using System;
using System.IO;
using System.Net;
namespace ElectronHTMlCSharp
{
public class HttpServices
{
private readonly string URL;
public HttpServices(string url)
{
URL = url;
}
public void Run()
{
Controller con = new Controller();
using (var listerner = new HttpListener())
{
listerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身份验证 Anonymous匿名访问
// listerner.Prefixes.Add("http://localhost:8080/web/");
listerner.Prefixes.Add(URL); //http://localhost/web/
listerner.Start();
Console.WriteLine("开启监听:" + URL);
while (true)
{
//等待请求连接
//没有请求则GetContext处于阻塞状态
var ctx = listerner.GetContext();
ctx.Response.StatusCode = 200;//设置返回给客服端http状态代码
//Console.WriteLine("url:" + ctx.Request.Url.ToString());
//Console.WriteLine("httpMethod:" + ctx.Request.HttpMethod.ToString());
//var queryString = ctx.Request.QueryString;
//Console.WriteLine("参数个数" + queryString.Count);
//Console.WriteLine("第一个参数键" + queryString.Keys[0]);
//Console.WriteLine("第一个参数值" + queryString[queryString.Keys[0]]);
//Console.WriteLine("rawUrl:" + ctx.Request.RawUrl.ToString());
ctx.Response.AddHeader("Access-Control-Allow-Origin", "*");
ctx.Response.ContentType = "text/html";
////使用Writer输出http响应代码
using (var writer = new StreamWriter(ctx.Response.OutputStream))
{
var url = ctx.Request.RawUrl.ToString();
url = url.Substring(1, url.Length - 1);
//判断是请求方法
var responseText = con.EventHander(url,null);
writer.WriteLine(responseText);
}
}
}
}
}
}
2.在App.config文件中的<appSettings>
中添加一下内容
<!--http-->
<add key="httpPort" value="9910"/>
<add key="addr" value="127.0.0.1"/>
3.在Program.cs
中创建方法,并在Main
方法中调用创建的方法调用方法写在 socket 方法之前
/// <summary>
/// 开启 http 服务监听 9910
/// </summary>
public static void StartHttp()
{
var url = string.Format("http://{0}:{1}/", AppTools.Get("addr"), AppTools.Get("httpPort"));
HttpServices httpServer;
httpServer = new HttpServices(url);
var thread = new Thread(new ThreadStart(httpServer.Run));
thread.Start();
}
4.在hander.js文件里,添加http请求的方法
4.1 修改GetSocketConf()
function getSocketConf() {
return {
ip: '127.0.0.1',
port: '9909',
httpPort:'9910',
}
}
4.2.添加方法
/**
* 发送http请求
* 依赖项:jQuery ,最好 2.0版本以上
*
* @param {string} action 请求地址 及参数 action!method?par1=1&par2=2&parn=n&....
* @param {function(object)} callback 回调函数
* @param {bool} isObject 是否将返回值转为对象
*/
function HanderHttp(action, callback, isObject) {
isObect = !isObect ? false : true;
var http = "http://" + getSocketConf()["ip"] + ":" + getSocketConf()["httpPort"] + "/" + action;
$.ajax({
url: http,
dataType: "text",
success: function (res) {
if (isObect) {
res = eval('(' + res + ')')
}
callback(res);
}
});
}
5.修改index.html 文件,在文件中添加按钮和按钮事件
<input type="button" id="sendHttp" value="发送Http请求" />
//侦听 发送Http请求按钮 事件,并将返C#端返回的数据 绑定到接受区域
$("#sendHttp").on("click", function(){
var msg = "Test!Test2?name=张三&age=20&sex=男&info=1427953302";
HanderHttp(msg, function(res) {
var html = $("#msg").html();
$("#msg").html(html + res);
})
});
6.启动?等等,我们还需要去TestController类中创建Test2方法
public string Test2()
{
return "['110000 北京市', ' 110100 市辖区','110101 东城区'," +
"'110102 西城区', '110105 朝阳区', '110106 丰台区'," +
"'110107 石景山区','110108 海淀区','110109 门头沟区'," +
"'110111 房山区','110112 通州区', '110113 顺义区'," +
"'110114 昌平区', '110115 大兴区','110116 怀柔区'," +
"'110117 平谷区', '110118 密云区','110119 延庆区'," +
"'120000 天津市', ' 120100 市辖区', '120101 和平区'," +
"'120102 河东区', '120103 河西区', '120104 南开区'," +
"'120105 河北区', '120106 红桥区', '120110 东丽区'," +
"'120111 西青区','120112 津南区','120113 北辰区'," +
"'120114 武清区','120115 宝坻区','120116 滨海新区']";
}