- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
之前使用的是Nancy库进行项目搭建的,使用的Nuget版本及其他引用如下 。
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.AspNet.WebApi.Client" version="5.1.1" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.1.1" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.Owin" version="5.1.1" targetFramework="net451" />
<package id="Microsoft.Owin" version="2.1.0" targetFramework="net451" />
<package id="Microsoft.Owin.FileSystems" version="2.1.0" targetFramework="net451" />
<package id="Microsoft.Owin.Host.HttpListener" version="2.1.0" targetFramework="net451" />
<package id="Microsoft.Owin.Hosting" version="2.1.0" targetFramework="net451" />
<package id="Microsoft.Owin.StaticFiles" version="2.1.0" targetFramework="net451" />
<package id="Nancy" version="0.22.2" targetFramework="net451" />
<package id="Nancy.Owin" version="0.22.2" targetFramework="net451" />
<package id="Nancy.Viewengines.Razor" version="0.22.2" targetFramework="net451" />
<package id="Newtonsoft.Json" version="4.5.11" targetFramework="net451" />
<package id="Owin" version="1.0" targetFramework="net451" />
<package id="System.Web.Razor.Unofficial" version="2.0.2" targetFramework="net451" />
<package id="Topshelf" version="3.1.3" targetFramework="net451" />
</packages>
昨天在搭建时感觉太多与臃肿,原因如下:
由于依托的为windows服务,且有独立配置程序,因此没有设计页面.
因之前版本多余久远,Nancy.Viewengines.Razor升级到2.2.0后会引入大量依赖,而不用前台页面也就不需要这个包了,与之类似的还有其他类似包体.
在优化时发现,可以不适用Nancy,而只是使用微软自带的WebApi依然可以完成.
之前版本太老,因此决定优化项目.
与之前一致,创建类库项目 HardwareGatewayApi 。
使用NuGet添加依赖,依次添加 Microsoft.AspNet.WebApi.OwinSelfHost 、 Microsoft.Owin.Host.HttpListener 、 Microsoft.Owin.Hosting 、 Microsoft.AspNet.WebApi 和 Newtonsoft.Json 。packages.config如下:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.AspNet.WebApi" version="5.2.9" targetFramework="net462" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.9" targetFramework="net462" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.9" targetFramework="net462" />
<package id="Microsoft.AspNet.WebApi.Owin" version="5.2.9" targetFramework="net462" />
<package id="Microsoft.AspNet.WebApi.OwinSelfHost" version="5.2.9" targetFramework="net462" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.9" targetFramework="net462" />
<package id="Microsoft.Owin" version="4.2.2" targetFramework="net462" />
<package id="Microsoft.Owin.Host.HttpListener" version="4.2.2" targetFramework="net462" />
<package id="Microsoft.Owin.Hosting" version="2.0.2" targetFramework="net462" />
<package id="Newtonsoft.Json" version="6.0.4" targetFramework="net462" />
<package id="Owin" version="1.0" targetFramework="net462" />
</packages>
主要用于创建WebApi的监听,监听服务后在进行其他配置,在该代码中需要配置传入传出的数据信息和绑定的端口号等.
在项目中创建 HGApplication 类,并添加如下代码:
public class HGApplication
{
protected IDisposable WebApplication;
public void Start()
{
AppDomain.CurrentDomain.Load(typeof(Microsoft.Owin.Host.HttpListener.OwinHttpListener).Assembly.GetName());
WebApplication = WebApp.Start<Startup>("http://*:9555/");
}
public void Close()
{
WebApplication.Dispose();
}
}
选择 HardwareGateService 项目,点击右键->生成依赖项->项目依赖项,选择HardwareGatewayWebApi项目.
最终会在引用中查看到项目的依赖:
在 HardwareGateService 项目的 Program 类中添加 HGApplication 的相关调用 。
internal class Application {
// 添加声明
HGApplication _host = null;
internal void Start() {
System.Console.WriteLine($"Start");
try
{
// 实例化
_host = new HGApplication();
// 调用开始方法
_host.Start();
}
catch (Exception ex)
{
throw new NotImplementedException();
}
}
internal void Stop() {
System.Console.WriteLine($"Stop");
if (_host != null)
{
_host.Close();
}
}
}
开始时未添加 AppDomain.CurrentDomain.Load(typeof(Microsoft.Owin.Host.HttpListener.OwinHttpListener).Assembly.GetName()); 代码,Web.Start会报如下错误:
System.MissingMemberException: The server factory could not be located for the given input: Microsoft.Owin.Host.HttpListener
将Microsoft.Owin.Host.HttpListener更新到了最新版本问题依然存在.
经过百度,bing查找后发现是Microsoft.Owin.Host.HttpListener必须手动引入,因此添加了该行代码.
将 WebApp.Start<Startup>("http://*:9555/"); 系统不报错,但是在测试时无法调用到后台,但是使用 WebApp.Start<Startup>("http://localhost:9555/"); 是可以的,后台根据查询资料发现是权限不够,使用如下代码后发现也不行:
<!--urn:schemas-microsoft-com:asm.v1修改成了urn:schemas-microsoft-com:asm.v2-->
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v2">
<!--添加了security-->
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
<publisherPolicy apply="yes" />
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.2.0" newVersion="4.2.2.0" />
</dependentAssembly>
</assemblyBinding>
在找资料时有篇文章说需要系统管理员权限,因此才恍然大悟,只需要使用管理员打开vs2022,然后打开本项目即可.
在添加监听后,可以自定义配置信息,为了以后更加方便,因此将传入和传出的类型改为了JSON方式。并添加了两种访问模式.
创建 Startup 类,代码如下:
// namespace 上添加该代码,HardwareGatewayWebApi.Startup为空间.该类
[assembly: OwinStartup(typeof(HardwareGatewayWebApi.Startup))]
public class Startup
{
public void Configuration(IAppBuilder app)
{
// 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888
HttpConfiguration config = new HttpConfiguration();
config.Formatters.Clear();
// 主要添加了Json格式化的相关信息
config.Formatters.Add(new JsonMediaTypeFormatter());
config.Formatters.JsonFormatter.SerializerSettings =
new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
////干掉xml序列号器
//config.Formatters.Remove(config.Formatters.XmlFormatter);
////解决json序列号时的循环问题
//config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
////对json数据使用混合大小写 驼峰式
//config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
////跟属性名同样大小输出
//config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();
// 增加自定义的访问配置
config.MapHttpAttributeRoutes();
// 通用访问配置
config.Routes.MapHttpRoute(
name: "default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
app.UseWebApi(config);
}
}
通用配置的名称需要以Controller结尾,通过设置的配置信息方法名为 {action} ,参数等可进行自定义,本例为测试.
在HardwareGateWebApi项目中添加 controller 文件夹,在该文件夹中添加 TestController 类,代码如下:
public class TestController : ApiController
{
[HttpGet]
public String Get()
{
return "HelloWorld";
}
[HttpGet]
public string Get(int id)
{
return $"收到数据{id}";
}
public string Post([FromBody] string data)
{
return data;
}
public string Delete(int id)
{
return $"delete数据{id}"; ;
}
}
当系统运行时访问http://localhost:9555/api/test/get/33,即可得到返回数据 。
通过自定义 Route 来设置路由,通过 HttpGet 或 HttpPost 等标签来定义访问的方式.
在controller文件夹中添加 HardwareGatewayController 类,并添加测试代码 。
public class HardwareGatewayController : ApiController
{
[HttpGet]
[Route("HardwareGateway/HelloWorld")]
public AjaxResult HelloWorld()
{
return AjaxResult.success($"HelloWorld") ;
}
}
当系统运行时访问: http://localhost:9555/HardwareGateway/HelloWorld,会得到如下结果:
在自定义访问配置中加入了AjaxResult类,用来统一输入和输出,AjaxResult代码如下:
[DataContract]
public class AjaxResult
{
/**
* 正常返回
*/
public const int OK = 0;
/// <summary>
/// 警告
/// </summary>
public const int WARN = 301;
/**
* 异常
*/
public const int ERROR = 500;
/// <summary>
/// 状态码
/// </summary>
[DataMember]
public int code { get; set; }
/// <summary>
/// 返回内容
/// </summary>
[DataMember]
public String msg { get; set; }
/// <summary>
/// 数据对象
/// </summary>
[DataMember]
public Object data { get; set; }
/**
* 无惨构造
*/
public AjaxResult() { }
/**
*填充正确结果
* @param data
* @return
*/
public static AjaxResult success(string strData)
{
return success(strData, "成功");
}
public static AjaxResult success(Object objData)
{
return success(JsonConvert.SerializeObject(objData), "成功");//JsonConvert.SerializeObject()
}
/**
* 填充错误结果
* @param data 数据
* @param message 开发者信息
* @return 错误结果描述
*/
public static AjaxResult error(String strData, string message)
{
return new AjaxResult(strData, ERROR, string.IsNullOrEmpty(message) ? "失败" : message);
}
/**
* 填充错误结果
* @param data 数据
* @param message 开发者信息
* @return 错误结果描述
*/
public static AjaxResult error(Object strData, string message)
{
return new AjaxResult(strData, ERROR, string.IsNullOrEmpty(message) ? "失败" : message);
}
/**
* 填充正确结果
* @param data 数据
* @param message 信息
* @return 正确结果描述
*/
public static AjaxResult success(Object objData, String message)
{
return new AjaxResult(objData, OK, string.IsNullOrEmpty(message) ? "成功" : message);
}
/**
* 带参数的构造
* @param data
* @param code
* @param message
*/
AjaxResult(Object objData, int code, String message)
{
this.data = objData;
this.code = code;
this.msg = message;
}
}
注:该代码的起源与ruoyi项目,因为上位机项目是java开发,因此进行了传参的统一.
自此,公共项目完成了初步搭建,后续将在公共项目添加硬件网关的相关代码.
该代码下载地址: https://github.com/wanghun315/HardwareGatewayProject_V1.0 。
最后此篇关于硬件管理平台-公共项目搭建(Nancy部分)的文章就讲到这里了,如果你想了解更多关于硬件管理平台-公共项目搭建(Nancy部分)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在使用 io-ts 时遇到一些问题。我发现它确实缺乏文档,我取得的大部分进展都是通过 GitHub issues 取得的。不,我不明白 HKT,所以没有帮助。 基本上,我在其他地方创建一个类型,ty
我必须创建一个正则表达式来搜索整个文件,以找到与 Java XML 解析器的第一部分(但不是第二部分)的匹配项。这将用于防止某些 XXE 攻击。不幸的是,它确实必须是单个正则表达式,并且它确实需要搜索
我有一些简单的 Shared/_Header.cshtml 文件中的内容。 My Shared/_Layout.cshtml 通过调用插入该代码 @Html.Partial("_Header") 目前
我有一个 if-else 语句,其中: 条件 1:ID 匹配并且自动填充某些字段。然后 if 语句只填充其余字段 条件 2:ID 不匹配,所有字段均为空白。 ELSE 语句将它们全部填充 当我使条件
我正在开发一个单页滚动网站。我正在尝试实现 ScrollMagic 并固定第一部分,以便网站的其余部分滚动到固定部分的顶部。我尝试创建一个 jsfiddle 来显示问题,但我似乎无法让 jsfiddl
这是我的情况: 我想使用 Google AdWords 的转换脚本,但出于某种原因,他们代码段的 javascript 部分在我的页面上添加了一些我似乎无法摆脱的不需要的空白。 所以我正在查看的选项纯
寻找一种优雅的方式在页面上添加一次脚本,就是这样。 我有一个需要 2 个 CSS 文件和 2 个 JS 文件的部分 View 。在大多数地方,只需要其中 1 个部分 View 。但在单个页面上,我需要
我想要一个网站,该网站始终具有相同的部分,具有相同的 id 以及我想要显示的所有内容。我对 javascript 不太了解,我想知道如何删除除特定部分之外的所有内容。 最好的方法是否是只执行一个循环来
SQL 语句教程 (11) Group By 我们现在回到函数上。记得我们用 SUM 这个指令来算出所有的 Sales (营业额)吧!如果我们的需求变成是要算出每一间店 (store_name)
我试图理解部分并认为我已经明白了。基本上,这是一种将部分应用程序应用于二元运算符的方法。所以我了解所有(2*) , (+1)等例子就好了。 但是在 O'Reilly Real World Haskel
有没有办法禁止在部分中覆盖给定的关键字参数?假设我要创建函数 bar总是有 a设置为 1 .在以下代码中: from functools import partial def foo(a, b):
我有这个使用节的 OpenMP 代码 #pragma omp parallel sections num_threads(8) { printf_s("Allo fro
我正在尝试重新创建 Apple 制作的有缺陷的 CNContactPickerViewController,因此我有一个数据数组 [CNContact],我需要将其整齐地显示在 UITableView
我有一个相对布局,其中包含一些 float 在 GridView 上的 TextView 。当我在网格中选择一个项目时,布局向下移动到屏幕的尽头,只有大约 1/5 的部分是可见的。这是使用简单的翻译动
我想在我的 tableView 中有两个部分。我希望将项目添加到第 0 节,然后能够选择一行以将其从第 0 节移动到第 1 节。到目前为止,我已将这些项目添加到第 0 节,但是当它关闭时数据不会加
我正在以自由职业者的身份开发支付控制软件,但我有一些关于 mysql 的问题。 。我有一个用作日志的表,名为“Bitacora”。在表中,我有一个名为 idCliente 的列,它是自己表中一个人的
我有一个 PFQueryTableViewController,我想向 tableview 添加部分,我这样尝试: - (PFQuery *)queryForTable { PFQuery *qu
我正在尝试编写一个查询,将部分匹配项与存储的名称值进行匹配。 我的数据库如下所示 Blockquote FirstName | Middle Name | Surname --------------
我正在开发一个语音备忘录应用程序,并且正在将文件保存到表格 View 中。我希望默认文件名显示为“新文件 1”,如果使用“新文件 1”,则它会显示为“新文件 2”,依此类推。 我正在尝试使用 do-w
我有以下简单的 HTML 布局 .section1 { background: red; } .section2 { background: green; } .section3 { ba
我是一名优秀的程序员,十分优秀!