在 csdn 的访问统计里面,只能用 csdn 提供的访问统计,因为在 csdn 中不支持在博客加上 js 代码,也就是无法使用友盟等工具统计。

通过在 asp dotnet core 创建一个图片链接的方式,将这个链接作为图片放在 csdn 的博客,可以在链接被访问的时候统计用户访问

新建一个 asp dotnet core 项目,在自己的 controler 里面添加一个方法,这个方法的访问链接是 xx.png 假装这是一张图片,请看代码

    [Route("api/[controller]")]
[ApiController]
public class ImageController : ControllerBase
{
[Route("csdn/Image.png")]
[HttpGet]
public FileResult GetCSDNImage()
{
// 忽略代码
}
}

在 csdn 上通过访问我的域名对应的链接就可以调用 GetCSDNImage 方法

![] (http://bulleimage.service.walterlv.com/api/image/csdn/image.png )

注意路由的命名要清真一点,我本来是用来做广告的,于是命名为广告,然而发现在 csdn 无法被访问到,原因请看 asp dotnet core 图片在浏览器没访问可能原因

通过在 GetCSDNImage 返回一张图片,同时按照这个方法调用的次数就可以用来统计用户的访问了

缓存图片

在 GetCSDNImage 需要返回图片才可以用来假装这是一个静态图片的链接

我将一张图片放在输出文件夹,做法就是在解决方案添加一张图片,右击属性设置复制输出到文件夹

在 Startup 的 ConfigureServices 里面添加内存缓存

        public void ConfigureServices(IServiceCollection services)
{
// 忽略其他代码
services.AddMemoryCache(); // 添加这一行代码就可以使用内存缓存 services.AddControllers()
.AddNewtonsoftJson();
// 忽略代码
}

修改 ImageController 在构造注入缓存 IMemoryCache 方法

        public ImageController(IMemoryCache memoryCache)
{
_cache = memoryCache;
} private IMemoryCache _cache;

这样就可以在 GetCSDNImage 方法里面使用缓存了

在使用缓存之前需要读取输出文件夹里面的图片,我添加一个方法用来读取输出文件夹里面的图片。在 asp dotnet core 中,很多都是使用指定静态的文件夹作为静态资源的文件夹,直接通过输出文件夹读取的比较少。但是设置一个静态文件夹是另外的知识,本文就直接通过输出文件夹读取

使用 Path.GetDirectoryName(Assembly.GetCallingAssembly().Location) 可以拿到输出文件夹,详细请看dotnet 获取程序所在路径的方法

使用下面代码就可以读取图片文件作为字节了,建议只读取一次,解决多线程访问文件的问题

        private byte[] GetImage()
{
var file = Path.Combine(Path.GetDirectoryName(Assembly.GetCallingAssembly().Location), "Image.png"); return System.IO.File.ReadAllBytes(file);
}

在 GetCSDNImage 方法里面通过缓存,判断如果缓存里面没有值就从文件读取图片,如果有值就直接从内存返回

如果这段代码是需要我自己写,可能要写几天,因为还存在了多线程访问的问题,如果一开始不存在值,那么就需要创建值,如何作为第一次创建值的时候,刚好多个线程进来,只有一个线程创建等问题。还好微软提供的缓存里面有这样的方法 GetOrCreate 方法,尝试从内存获取,如果获取不到就创建,在这个方法里面第一个参数是传入 key 第二个参数就是传入如何创建的方法。在缓存中就通过 key 来获取或设置值,用法和字典差不多

            var file = _cache.GetOrCreate("Image", entry => GetImage());

现在拿到了值,可以通过 File 方法返回,注意在返回的时候添加 content type 说这是一张图片


public FileResult GetCSDNImage()
{
var file = _cache.GetOrCreate("Image", entry => GetImage()); return File(file, "image/png");
}

统计用户访问

我不会告诉大家如何去创建数据库去存放用户访问的数据,因为这些需要的知识点有些多,本文的统计用户访问只是通过一个简单的静态变量获取,不考虑并发的问题


public FileResult GetCSDNImage()
{
Count++; Console.WriteLine($"总共有{Count}访问"); // 忽略其他代码
} private static int Count { set; get; }

这样就可以完成了统计用户的访问了,同时代码也很少。我还需要用户的 IP 和使用什么浏览器,于是需要添加一点代码

我的网站是通过 frp 让用户访问,需要从 Frp 获取用户真实 IP 地址用法有点复杂

        private static bool TryGetUserIpFromFrp(HttpRequest httpContextRequest, out StringValues ip)
{
return httpContextRequest.Headers.TryGetValue("X-Forwarded-For", out ip);
}

上面这个方法就可以从 HttpRequest 拿到从 frp 获取的用户 ip 地址

        public FileResult GetCSDNImage()
{
// 忽略代码 if (TryGetUserIpFromFrp(HttpContext.Request, out var ip))
{ } // 忽略代码
}

获取用户的浏览器使用 Headers 里面的 User-Agent 可以拿到

        public FileResult GetCSDNImage()
{
// 忽略代码 if (HttpContext.Request.Headers.TryGetValue("User-Agent", out var userAgent))
{ } // 忽略代码
}

将这些值合并输出

        [Route("csdn/Image.png")]
[HttpGet]
public FileResult GetCSDNImage()
{
Count++; StringBuilder str = new StringBuilder();
str.Append(DateTime.Now);
str.Append(" ");
str.Append("用户访问 "); Console.WriteLine(GetUserId());
Console.WriteLine("用户id =" + HttpContextAccessor.HttpContext.Request.HttpContext.Session.Id); if (TryGetUserIpFromFrp(HttpContextAccessor.HttpContext.Request, out var ip))
{
str.Append("用户Ip=");
str.Append(ip);
str.Append(" ");
} str.Append($"总共有{Count}访问"); if (HttpContext.Request.Headers.TryGetValue("User-Agent", out var userAgent))
{
str.Append("\r\n");
str.Append("当前用户浏览器");
str.Append(userAgent);
} Console.WriteLine(str); var file = _cache.GetOrCreate("Image", entry => GetImage()); return File(file, "image/png");
}

我将这个图片放在 csdn 的博客,运行服务在用户访问的时候可以看到下面的输出

2019/5/26 11:39:24 用户访问 用户Ip=58.209.53.254 总共有13访问
当前用户浏览器Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36

如果要分析什么时候的用户访问有多少,就需要添加数据库,这些需要的知识有点多,本文就不告诉大家

代码很简单,都放在 github

添加数据库版本请看 csdn 访问统计

现在 csdn 也支持自定义域名的统计,在自己博客点击管理博客,就可以找到下图界面

dotnet 获取程序所在路径的方法

asp dotnet core 从 Frp 获取用户真实 IP 地址

asp dotnet core 图片在浏览器没访问可能原因

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

asp dotnet core 通过图片统计 csdn 用户访问的更多相关文章

  1. ASP.NET Core奇遇记:无用户访问,CPU却一直100%

    这是5月11日遇到的一个问题,1台1核1G阿里云Linux服务器运行着生产环境中的ASP.NET Core站点,出现CPU 100%问题. 开始以为是这台服务器负载高引起的,于是将这台服务器从负载均衡 ...

  2. 2019-11-29-asp-dotnet-core-通过图片统计-csdn-用户访问

    title author date CreateTime categories asp dotnet core 通过图片统计 csdn 用户访问 lindexi 2019-11-29 08:26:58 ...

  3. 2019-7-2-asp-dotnet-core-通过图片统计-csdn-用户访问

    title author date CreateTime categories asp dotnet core 通过图片统计 csdn 用户访问 lindexi 2019-7-2 19:21:2 +0 ...

  4. win10 uwp 使用 asp dotnet core 做图床服务器客户端

    原文 win10 uwp 使用 asp dotnet core 做图床服务器客户端 本文告诉大家如何在 UWP 做客户端和 asp dotnet core 做服务器端来做一个图床工具   服务器端 从 ...

  5. win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序

    本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...

  6. asp dotnet core 支持客户端上传文件

    本文告诉大家如何在 asp dotnet core 支持客户端上传文件 新建一个 asp dotnet core 程序,创建一个新的类,用于给客户端上传文件的信息 public class Kanaj ...

  7. asp dotnet core 从 Frp 获取用户真实 IP 地址

    我在本地开一个服务,然后通过 Frp 让小伙伴可以在外网访问我的 API 连接,但是直接通过 RemoteIp 拿到的是本地的地址.本文告诉小伙伴如何通过 Frp 可以拿到用户的真实 IP 地址 我写 ...

  8. asp dotnet core 图片在浏览器没访问可能原因

    我写了一个项目用来广告就用到广告的图片,但是广告的图片放在博客的链接无法访问,连我的方法都没有调用,而我尝试网页直接访问图片链接是可以访问的,最后找到原因是广告插件禁用了图片访问 我在一个方法创建了广 ...

  9. asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User

    前言 很多时候其实我们并不需要asp.net core自带的那么复杂的用户系统,基于角色,各种概念,还得用EF Core,而且在web应用中都是把信息存储到cookie中进行通讯(我不喜欢放cooki ...

随机推荐

  1. Oracle SQL——如何用一个表的数据更新另一个表中的数据

    背景 一次处理数据的过程中,需要将表A(源表)的数据更新到表B(目标表)中 前提 两张表一定要有关联字段 使用关联字段联查两张表时,两张表关系必须满足条件:目标表和源表的表间关系一定是多对一或者一对一 ...

  2. (六)IO流之过滤流

    过滤字节流FilterInputStream和FilterOutputStream BufferedInputStream和BufferedOutputStream    需要使用已存在的节点流来构造 ...

  3. Libevent:0异步IO简介

    一:异步IO简介 大多数的初级编程者都是从阻塞IO调用开始网络编程的.阻塞(同步)IO调用指的是:调用会一直阻塞,不会返回,直到发生下面两种情况之一.要么操作完成,要么经历相当长的时间,网络协议栈自己 ...

  4. 基于Tablestore Tunnel的数据复制实战

    前言 数据复制主要指通过互联的网络在多台机器上保存相同数据的副本,通过数据复制方案,人们通常希望达到以下目的:1)使数据在地理位置上更接近用户,进而降低访问延迟:2)当部分组件出现故障时,系统依旧可以 ...

  5. Implement strStr() 字符串匹配

    Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...

  6. I/O模型: 阻塞、非阻塞、I/O复用、同步、异步

    I/O模型不论在实际使用还是准备笔试面试中都是重要的内容,参考Unix网络编程进行总结如下.(尤其注意红色标注处) 1. 明确I/O考察的对象和流程 参考Unix网络编程,一个输入操作通常包括两个不同 ...

  7. 冒泡排序&&选择排序 以及时间效率对比

    package com.test4; import java.util.*; //Calendar 显示时间 /** * @author qingfeng * 功能:冒泡排序 */ public cl ...

  8. python 自动登录网页

    语言:python 浏览器:chrome 工具:chrome控制台 #!/usr/bin/python # coding: GBK import urllib,urllib2,httplib,cook ...

  9. tp3 key json 分页

    //json 强制转换为array $arr[$key]['checkpro'] = json_decode($val['checkpro'],JSON_FORCE_ARRAY);    $arr[$ ...

  10. 模板—BSGS

    #include<iostream> #include<cstdio> #include<cmath> #include<map> #define LL ...