C# 如何使用Blazor使用RFID/NFC

C# 如何使用Blazor使用RFID/NFC,c#,razor,blazor,C#,Razor,Blazor,正如标题所示,我想在blazor应用程序中实现一个RFID阅读器 传统上,DotNetCore应用程序在服务器端运行。但是有了blazor clientside这可能吗 blazor是否支持Active X 更新: 假设您指的是通过本地通信端口(COM、USB、蓝牙等)使用与常见RFID和NFC硬件一起工作的桌面PC.NET程序集,则不可能 然而,几年后,如果浏览器供应商增加了对API的支持,那么您可以从代码中使用这些API 一些RFID硬件供应商(包括系统集成商和实际的硬件OEM)提供基于基础

正如标题所示,我想在blazor应用程序中实现一个RFID阅读器

传统上,DotNetCore应用程序在服务器端运行。但是有了blazor clientside这可能吗

blazor是否支持Active X

更新: 假设您指的是通过本地通信端口(COM、USB、蓝牙等)使用与常见RFID和NFC硬件一起工作的桌面PC.NET程序集,则不可能

然而,几年后,如果浏览器供应商增加了对API的支持,那么您可以从代码中使用这些API

一些RFID硬件供应商(包括系统集成商和实际的硬件OEM)提供基于基础设施的读卡器/扫描仪(永久安装在墙上或天花板上的那种),这些读卡器/扫描仪提供基于HTTP的web服务(SOAP、REST等),Blazor代码也可以使用这些服务

以下是一份清单:

  • 使用浏览器内JavaScript API的Internet/LAN网站或PWA:

    • 直连(包括PAN/蓝牙)RFID+NFC读卡器硬件:
      • 蓝牙:可能,它取决于硬件和浏览器支持。(还请注意,尽管共享“蓝牙”品牌,但蓝牙LE和“正常”蓝牙有很大不同)
      • USB/COM:目前没有,也没有其他浏览器支持它
    • 具有基于HTTP的web服务的基础结构扫描仪/读卡器:,前提是您可以使用
      fetch
      /
      XMLHTTPRequest
      EventSource
      WebSocket
      访问它们
  • 使用Blazor中的C#代码和.NET库的Internet/LAN网站或PWA(因此从Blazor中调用浏览器JavaScript API)

    • 直连(包括PAN/蓝牙)RFID+NFC读卡器硬件:(因为Blazor中不提供操作系统服务/系统调用)
    • 具有基于HTTP的web服务的基础结构扫描仪/读卡器:,前提是您可以使用
      HttpClient
      访问它们
  • 使用Cordova/PhoneGap或Electron的设备应用程序(移动或桌面):

    • 直接连接(包括PAN/Bluetooth)RFID+NFC阅读器硬件:可能,取决于Cordova、PhoneGap或Electron环境提供的额外API
    • 具有基于HTTP的web服务的基础结构扫描仪/读卡器:,前提是您可以使用
      fetch
      /
      XMLHTTPRequest
      EventSource
      WebSocket
      访问它们
  • 在用户计算机上安装了服务进程的桌面计算机,该计算机通过仅限本地主机的HTTP侦听器与web应用程序交互:

    • 。见下面我的原始答案
    • 请注意,此解决方案意味着服务流程可以直接与web应用程序通信,而无需web浏览器应用程序
原始答复: 简言之:不,这是不可能的

虽然Blazor代码确实在客户机上运行,但它并不是以本机CPU指令的形式运行(它实际上是以浏览器JavaScript引擎中解释的或JIT编译的Web汇编代码的形式运行的)——这意味着它也是非常紧密的沙盒

简而言之:在Blazor中,如果没有浏览器提供的API用于在浏览器之外与计算机交互,那么您就不能这样做

作为解释:.NET代码能够在Blazor中运行,因为Blazor-所以浏览器实际上不会一次下载整个20MB以上大小的Blazor应用程序

Blazor基本上提供了自己版本的
mscorlib.dll
、System.dll``和其他程序集,这些程序集将删除所有涉及浏览器中不可用的平台服务的操作,而
会抛出新的PlatformNotSupportedException
——因此,如果您尝试使用.NET中的文件系统API(
System.IO.File
等)然后会出现异常/错误

在PC上的任何图灵完整编程环境(如Blazor和WebAssembly)中,您可以执行任何想要的信息处理任务,但可以执行任何在现实生活中发生的程序活动(例如IO、进行系统调用、控制硬件设备)必须通过系统调用通过操作系统,.NET系统调用在CLR内部发生(通常使用
MethodImplOptions.InternalCall
方法和P/Invoke(
[DllImport]
)方法)-这根本不是Blazor CLR制作的-尽管有些API被重新映射到本机JavaScript,例如
Console.WriteLine
被映射到
Console.log

至于ActiveX——15年来,没有浏览器支持不受限制的、非沙盒的ActiveX控件。ActiveX已经死了。浏览器也已经放弃了对Java小程序的支持

可能的解决办法: 也就是说,如果您可以在客户端计算机上安装自己的程序,那么您就可以让您的web应用程序(即使它托管在公共Internet网站上)通过本地HTTP服务器(包括WebSocket)与客户端程序通信从本地浏览器发出的
fetch
XMLHttpRequest
请求访问(幸运的是没有外部连接)。这就是Dell Computers网站“查找我的计算机的服务标签”的方式功能有效:Dell电脑预装了一个小型web服务器,用于侦听环回请求并使用服务标签进行回复(我认为请求确实需要签名,这样第三方网站就不能做同样的事情来获取访问者的Dell服务标签)

  • 编写一个单独的程序(例如Windows服务守护程序),该程序:

  • 运行一个微型HTTP服务器,该服务器只侦听
    127.0.0.1:12345
    ,并执行RFID/NFC操作以响应传入的请求
  • 添加对
    web的支持