.NET Framework WebAPI中使用Swashbuckle启用 Swagger example responses(Inline Model)

尽管.NET Core新版本的WebAPI中可以直接从XML中读取出要输出的Swagger相应示例,但我还在使用老的.net framework,那么怎么增加Inline Model的示例输出呢?

首先说明,我现在的API都是统一输出成HttpResponseMessage,截图如下:

如果您也是使用这种方式,或者使用async Task<HttpResponseMessage>的返回方式,都可以参考本文的方法,增加输出的响应值类型和示例。

先引用:using Swashbuckle.Swagger.Annotations;,然后在Controller的方法上增加如下注解。

[SwaggerResponse(HttpStatusCode.OK, Type=typeof(IEnumerable<Country>))]
[SwaggerResponseExample(HttpStatusCode.OK, typeof(MyExamples))]
[SwaggerResponse(HttpStatusCode.BadRequest, Type = typeof(IEnumerable<ErrorResource>))]

然后这里的写我们的示例代码:

public class MyExamples : IExamplesProvider
{
    public object GetExamples()
    {
        return new List<Country>
        {
            new Country { Code = "CN", Name = "China" },
            new Country { Code = "US", Name = "American" }
        };
    }
}

最后别忘了SwaggerConfig中开启ExamplesOperationFilter

c.OperationFilter<ExamplesOperationFilter>();

好了,最后看下真实输出效果。因为我偷懒,没用写Example Value,只放了数据类型Inline Model。

C# .NET中除法结果的精度是根据(被)除数来决定的!

2022年5月25日补充如下:

精度不是根据除数决定,而是除数和被除数任何一个。截图如下:

再次感谢码农很忙的提醒,这里还是功力不够,未充分动手,结论不严谨。

这已经是第二次碰到了,以前自己写遇到过,知道怎么避坑。

这次分配给一个小朋友去写这段程序,就出问题了。

比方说:45/100=0.45,但是如果这个100是int类型,返回值就是0.

那么必须将分母根据实际需要转换为所需的精度类型,如decimal或float/double。

再次强调一遍:C# .NET中除法结果的精度是根据被除数来决定的!

使用SQL模糊查询手动删除WordPress垃圾留言

虽然用了最著名的Akismet 反垃圾评论插件,但是还是会出现几千条垃圾留言。

我已经删除过一次了,我记得大概3000多条,这次又来了近2000条,特点还是来自.ru后缀,也就是俄罗斯的垃圾评论群发软件搞得。

好了,打开phpMyAdmin,登录数据库,点击SQL,粘贴以下SQL,点击执行,搞定!

DELETE FROM `cuiwenyuan_com`.`wp_comments` WHERE `wp_comments`.`comment_author_email` LIKE '%.ru%'

如果还想对内容筛选并自动删除,可以使用如下SQL

DELETE FROM `cuiwenyuan_com`.`wp_comments` WHERE `wp_comments`.`comment_author_email` LIKE '%.ru%' OR `wp_comments`.`comment_content` LIKE '%.ru%'

Stimulsoft Web版中如何动态修改Json数据源的Url

在Stimulsoft Report(目前我使用的是2022.1.2版本)中,可以支持从JSON文件或者在线URL作为数据源。

当设计完报表之后,一般要连接正式的服务器URL,所以我希望能动态的修改这个URL。

我照着官方示例写了如下代码,虽然能够工作,但我觉得不是很简洁。

// 从Json获取数据        
StiJsonDatabase jsonDatabase = new StiJsonDatabase
{
    Alias = "JSON",
    Key = "",
    Name = "JSON",
    PathData = "myPath?action=ExpenseByStore&CompanyCode=101&CurrentYear=2022"
};
report.Dictionary.Databases.Clear();
report.Dictionary.Databases.Add(jsonDatabase);

后来从官方支持获得如下写法,果然简洁!不得不说Stimulsoft的中文资料太少,这也是我开始在博客写下一些填过坑的原因。

var newUrl = "myPath?action=ExpenseByStore&CompanyCode=101&CurrentYear=2022";
(report.Dictionary.Databases[0] as StiJsonDatabase).PathData = newUrl;

另外呢,今天收到新版的更新通知了,感兴趣的小伙伴可以下载更新了。

Bartender标签设计打印软件中使用Visual Basic脚本自定义组合数据

Bartender软件很强大,近期有用户需要在一个二维码中展示多个数据库字段的组合信息,使用Visual Basic脚本的方式,非常容易就达成了。

另外,用于显示动态的年、月、日、季度,当年第几天等这种信息,直接使用Visual Basic自带的函数就可以搞定。

如何解决Newtonsoft.Json的版本冲突

在调用金蝶云星空的时候,引用的其C# SDK,但是他使用的是低版本的Newtonsoft,本来想要反编译,然后引用新的版本。后来问了群里的朋友,其实有一个简单的办法。

未能加载文件或程序集“Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)的错误解决方案

System.IO.FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

那就是在Web.config(WebApplicaiton/WebAPI)下或者App.config(Winform)下的runtime节点增加以下代码。

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

这个方法可以解决所有的引用DLL中的第三方DLL的版本问题。

升级VS2019 16.11.5引起的error CS0246: The type or namespace name ‘FieldDescription’ could not be found (are you missing a using directive or an assembly reference?)

昨晚上看到VS2022的新的Preview版本发布,就连同VS2019一起升级到了最新版。

可没想到的是,我有个项目中的DLL引用就开始编译报错了。

昨晚上弄了几个小时,删掉引用,重新添加也不行。从GitHub上下载老版本同样编译报错。

找同事试了一下,他用的老版本的VS 2019,没有编译问题。

那可以肯定的是我本地VS2019的问题!

于是上午用VS2022打开编译,同样也是报错。

后来我就到Project属性当中看到Reference Path,以前也没关注过这个的。尝试着增加了我外部引用的DLL路径。

你猜怎么着?

没报错了!

我看了一个修改后的GitHub的Git Changes提示也没有,原来这个设置是保存在了csproj.user文件中。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <ProjectView>ShowAllFiles</ProjectView>
  </PropertyGroup>
  <PropertyGroup>
    <ReferencePath>E:\Github\DotNet.WangCaiSoft\src\DLL\DotNet\</ReferencePath>
  </PropertyGroup>
</Project>

难道是我的ToolsVersion为Current的缘故?

哪位高手如果碰到类似情况,不让忘记这个error CS0246的报错,看看你的Reference Path增加上是否就解决了。

我还有一个猜测,就是我同时也安装了VS2022预览版的缘故?

非常规方式处理Oracle+.NET开发全球化的时区显示

咨询了几个大牛有关.NET开发中全球化的时区显示问题,大家的意见有三个:

1、使用UTC Time记录到数据库,展示的时候根据用户所选择的时区进行转换展示
2、使用固定时区DateTime记录到数据库,展示的时候根据用户所选择的时区进行转换展示
3、记录timestamp到数据库,选择DateTime.UTCTime转为秒或毫秒级别的timestamp,展示的时候转为时间类型,并根据用户所选择的时区进行转换展示

大部分人喜欢1,其次是3,最后是2

而我今天要分享的这个Oracle数据库下的开发,有个前提就是我不能修改数据库,也不能修改写入数据库的时间是指定时区的,因为Infor LN ERP中更新此时间字段,幸运的是它本来就是UTC Time。

但是呢,我不能直接用第1条方案,因为我有些筛选条件,根据用户的日期(时间)还需要筛选数据,那么我不想:既修改展示阶段的时间时区,又修改查询时候的输入时间。

于是就有了今天的非常规方案:sessiontimezone

当我们在Oracle数据库中执行以下SQL时,可以知道数据库的时区和我当前连接的时区。

SELECT BTIMEZONE,SESSIONTIMEZONE,TZ_OFFSET(DBTIMEZONE),TZ_OFFSET(SESSIONTIMEZONE) FROM DUAL;

那么我们就可以使用:TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))/24,来动态的展示当前连接所在时区的时间了

SELECT TO_CHAR(A.T$CNFT + TO_NUMBER(SUBSTR(TZ_OFFSET('" + GetUserTimeZone() + "'),1,3))/24, 'YYYY-MM-DD HH24:MI:SS') AS ConfirmedTime FROM MYTABLE A

此处的GetUserTimeZone就是根据当前用户的市区设置,读取到一个“-5:00”或”6:00″形式的TimeZone。

至于用户的时区是根据用户所属的国家来还是根据用户的个人设定,这里的逻辑可以灵活设定优先级。

虽然非常规方案可以满足需要,但是不具备普遍性,性能上也会很依赖Oracle数据的配置。

如果您碰巧也有类似的场景,不妨试试这个方案。

.net framework 4.0的NuGet包制作

为啥做这个呢,因为要将公司内部的老的.NET程序所引用的DLL进行统一管理。这里服务端使用了一个叫做NuGetServer(官网:NuGet Server)的开源工具,部署在内部的Web服务器上。

制作NuGet包,我是先从.NET Standard 2.0的SDK风格的文件去创建的,特别容易。但是.NET 4.0这种废了好大周折!

试过直接通过DLL生成,但是会遇到包描述、版本等信息不自动更新的问题,最重要的DLL所引用的NuGet.org的包,不能自动包含进去。

也试过通过命令行进行每个单独的Project进行生成,也遇到包描述、版本等信息不自动更新的问题。NuGet.Org的包没问题。

最后呢使用Tools>External Tools(工具>外部工具)定义了一个命令。

要确保MSBUILD和NUGET好用,需要找到系统环境变量,添加路径(记得重启电脑,以便生效)。

找到Path项
1、增加:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin
2、增加:E:\VS\DotNet.WMS.US\DLL\DotNet

第一个是MSBuild,如果你是VS 2019社区版,直接复制,如果不是,请找到相应的路径。
第二个是NuGet.exe的目录,请选择您自己的目录。

这块设置参考这篇文章:https://www.cnblogs.com/chenug/p/9290281.html

命令:del *.nupkg ; $roj=dir *.csproj ;MSBuild $roj; nuget pack $roj ; $nupkg= dir *.nupkg;
执行目录选择$(ProjectDir)

需要生成的时候,点击一下要生成的Project,然后就可以点击Tools > 4.0NuGet命令

稍等片刻就生成了。

这样生成的包在Project的根目录,但是版本和描述信息呢都不对,请自动修改文件名和文件内部的描述文件内容。

用啥软件打开,7-ZIP即可,因为包就是一个压缩包。

2021开始用DBeaver连接各种数据库:强烈推荐这款免费开源的通用数据库工具

平常用微软的SQL Server(MSSQL)数据库最多,用的是微软的SQL Server Management Studio (SSMS) 客户端,免费的。

Oracle使用频率次之,用的是它自家的Oracle SQL Developer,也是免费的。

MySQL数据库使用的最少,用得是以前介绍过的SQLyog,免费试用版,过期了也不用了。

最近又要连接MySQL数据库了,听说Navicat for MySQL不错,企业版永久授权活动价也就1600多块钱。但用得实在不多,就懒得买了。

在捣鼓Ubuntu Server的虚拟机下Ngnix的过程中,安装了Ubuntu Desktop版本,通过其App Store找到了DBeaver CE(Community Edition社区版),评价很高,并且免费开源。

在Ubuntu下体验了一下,还挺不错,支持很多数据库,使用时自动下载相应的数据库驱动。

于是在Windows下就正式启用了,下载的速度不快,官网是:DBeaver Community | Free Universal Database Tool

这款软件定位是免费开源的通用数据库工具:为开发者、数据库管理员、分析师和所有需要使用数据库的人提供免费的多平台数据库工具。支持所有流行的数据库:MySQL、PostgreSQL、SQLite、Oracle、DB2、SQL Server、Sybase、MS Access、Teradata、Firebird、Apache Hive、Phoenix、Presto等。

软件是基于Java开发的,所以支持跨平台:Linux、Windows、Mac都支持。除了社区版和企业版,它还有云端的基于浏览器的版本。

安装后首次运行会问你要不要创建一个SQLite的示例数据库,用于探索软件。这个引导功能做的挺赞,必须赞一下。

我试了访问MySQL、SQL Server,体验挺不错的,第一时间就把过期的SQLyog删除了。

后续我会深度用一下它的MySQL和Oracle连接数据库,请关注后续更新。

如果你也有类似管理MySQL的需要,不妨试试这款DBeaver:非常强大易用的数据库管理和开发工具。