- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我希望通过 2 个或更多路由模式执行相同的操作。 例如: //Route 1: Get["/{category}/{product_name}/{id}"] // Route 2: Get["/api
我正在开发一个使用 WPF 应用程序中托管的 Nancy 的小项目。我希望能够远程下载 ~8MB 的 PDF 文件。我能够让下载工作,但在下载过程中,应用程序不会响应任何其他请求。有没有一种方法可以允
我正在使用 Nancy 通过 Web 服务实现 API。 我想要一个/help 或/docs 页面以编程方式列出所有可用路由,以便我可以为 API 用户提供自动生成/更新的文档。 关于如何做到这一点的
有没有办法为 Nancy 服务自动生成 Swagger 文档(或类似文档)? 我找到了Nancy.Swagger ,但是没有关于如何使用它的信息,并且演示应用程序似乎没有演示生成文档(如果有,它并不明
我看过这个帖子:Nancy: how do I capture all requests irrespective of verb or path并关注了 github 文章。 但它不起作用。我只是在
我在 Nancy 中提供静态内容(例如 JavaScript)时遇到问题。 例如使用 self hosting sample我在 Views 文件夹中添加了一个 test.js 并添加了一个 标记到
我是 Nancy 的新手,我想返回自定义 HttpStatusCode 和正文(内容)。如果我返回 HttpStatusCode,它会返回一个空白正文。如果我返回一个字符串,那么它会返回该字符串作为正
我正在创建一个 Nancy 模块,该模块最终将托管在 Windows 服务内。我目前正在 WPF 测试应用程序中运行它。要启动 Nancy 托管,我使用 Nancy.Hosting.Self 并调用:
我不知道如何使用 Super Simple View Engine 预选下拉菜单。 我的模型有一个属性datatype,它是一个数字,我想在下拉列表中预先选择它。 正如我从文档中看到的那样,条件语句仅
我想在每个请求中做一些事情,无论是模块还是路由。我如何在 Nancy 2.x 中完成此操作? 如果找到How to Intercept all Nancy requests和 How do I cap
得知 Nancy 有自己的 razor 实现时,我有点吃惊,它的行为可能像也可能不像 razor。在实践中,这会导致问题吗?什么是“大多数人”用于 Nancy View 引擎的?为什么没有使用真正的
在使用 Nancy FX 时,我遇到了以下异常,该异常是在尝试启动 Web 服务时引发的:AutomaticUrlReservationCreationFailureException 更详细地研究后
我正在尝试运行一个自托管的 Nancy 应用程序,但我无法让它返回有效响应。我是南希的新人;我希望我的问题是相当简单的。 这是一些代码: class Program { static void
我想要在初始匹配后匹配/捕获所有 url 段的 nancy 规则。 例如,我想这样做: 有一个网址,如:/views/viewname/pageid/visitid/someother 和这样的规则:
我们通过 NuGet 将 Nancy 从 v1.2.0 更新到 1.3.0。根据changelog似乎没有与我们的应用程序相关的重大更改。但是我们现在收到运行时错误 Method not found:
我在工作中使用 topShelf (Windows 7) 编写了一个 Nancy 自托管服务,它工作得很好。我把它带回家并在 Windows 10 下运行它,但出现以下错误: Nancy 自身主机无法
我已经阅读了很多 Jabbr代码来学习 Nancy 并尝试在我自己的应用程序中实现许多相同的模式。我似乎无法开始工作的一件事是应用程序启动类的概念。 Jabbr 代码库有一个 App_Start带有
我需要重定向到当前模块下的路径: modulePath = "/test"; Get["/there"] = ... Get["/here"] = routeParams => { return
我已经设置了一个 Nancy bootstrap 来从非默认目录路径(它是自托管的 Nancy)提供静态内容。 奇怪的是,以下内容适用于自定义 View 位置约定,但不适用于 js 或 css 静态内
我正在拼凑一个基于 Nancy.Demo.Authentication.Forms 的演示应用程序. 我正在实现 Claims和 UserName在我的UserIdentity:IUserIdenti
我是一名优秀的程序员,十分优秀!