.NET5框架下使用HttpListener类实现http接口监听替代OWIN自我寄宿
场景:
最近开发了一款基于PaddleOCR开源库的辅助集成工具类的软件,为了简化对接就采用了软件自身集成webapi代理接口的方式来提供识别服务来避免技术跨界是的问题。
软件采用.net5框架下WPF开发,接口服务部分原本使用的是OWIN + SelfHost来实现webapi自我寄宿方式实现以供外部调用,本地debug调试以及发布时运行都没有问题,但发布软件加密后却发现接口服务怎么都起不来,搞了好久没解决,最后不得已就采用了比较原始的HttpListener来实现接口监听,好在可以正常运行了还少引用了好几个组件库dll文件,可能是接口功能代码比较少的缘故目前感觉也还不错
下面就是HttpListener类实现http接口的核心代码 需要的同学可以参考下
static HttpListener _HttpListener;
public static bool Start(out string error)
{
error = "";
if (!HttpListener.IsSupported)
{
//系统不支持
return false;
}
try
{
_HttpListener = new HttpListener();
string host1 = $"http://127.0.0.1:8888/";
string host2 = $"http://本地ip:8888/";
_HttpListener.Prefixes.Add(host1);
_HttpListener.Prefixes.Add(host2);
_HttpListener.Start();
Task.Factory.StartNew(async () =>
{
//这里使用的while循环去监听消息。其实还有一种BeginGetContext的方式去监听消息 但感觉还没这个干净代码量还要多一些就懒得换了,有兴趣的同学百度找一下
while (_HttpListener.IsListening)
{
HttpListenerContext context = _HttpListener.GetContext();
//context 就和一般的.net mvc web项目里控制器里的httpcontext 类似 这里就不细说了
await Task.Run(() =>
{
//输出信息流
using (StreamWriter writer = new StreamWriter(response.OutputStream))
{
response.StatusCode = 200;
response.AddHeader("Content-Type", "application/json");
writer.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new {success=true,message="执行成功"}));
}
});
await Task.Delay(1);
}
});
return true;
}
catch (Exception ex)
{
error = ex.Message;
return false;
}
}