C# 如何从ASP.NET应用程序中连接到服务器端USB(HID)设备?

C# 如何从ASP.NET应用程序中连接到服务器端USB(HID)设备?,c#,asp.net,usb,hid,C#,Asp.net,Usb,Hid,我正在尝试为USB设备编写自己的控制器,而不是使用产品附带的SDK(我觉得SDK还不够好) USB设备插入运行此应用程序的同一服务器。 所以我决定去努吉,去图书馆 PM>安装程序包库 然后我继续学习上的例子 首先,我进入控制面板验证VendorID和ProductID 我把它写进了我的代码里 然后我在抓取设备的线路上设置了一个断点,但不幸的是,它总是返回null using HidLibrary; public class MyController : ApiController {

我正在尝试为USB设备编写自己的控制器,而不是使用产品附带的SDK(我觉得SDK还不够好)

USB设备插入运行此应用程序的同一服务器。

所以我决定去努吉,去图书馆

PM>安装程序包库

然后我继续学习上的例子

首先,我进入控制面板验证VendorID和ProductID

我把它写进了我的代码里

然后我在抓取设备的线路上设置了一个断点,但不幸的是,它总是返回
null

using HidLibrary;
public class MyController : ApiController
{

    private const int VendorId = 0x0BC7;
    private const int ProductId = 0x0001;

    private static HidDevice _device;

    // POST api/<controller>
    public string Post(CommandModel command)
    {

        _device = HidDevices.Enumerate(VendorId, ProductId).FirstOrDefault();

        if (_device != null)
        {
            // getting here means the device exists
        }
        else
        {
            // ending up here means the device doesn't exist
            throw new Exception("device not connected");
        }
        return null;
    }
使用HidLibrary;
公共类MyController:ApiController
{
私有常量int VendorId=0x0BC7;
private const int ProductId=0x0001;
专用静态HIDU设备;
//后api/
公共字符串Post(CommandModel命令)
{
_device=HidDevices.Enumerate(供应商ID,产品ID).FirstOrDefault();
如果(_设备!=null)
{
//到达这里意味着设备存在
}
其他的
{
//在这里结束意味着设备不存在
抛出新异常(“设备未连接”);
}
返回null;
}

我希望这是一件愚蠢的事情,而不是关于直接从IIS工作者连接到USB设备的一些破坏交易的权限问题。

将相同的代码放在控制台应用程序中并运行它。这将帮助您验证它是您的代码还是您的环境


如果是在环境中,请尝试使用Process Monitor查看是否存在任何隐藏的访问错误。还可以尝试枚举所有设备,而不仅仅是查找您要查找的一个设备,而是查看您是否可以在ASP.NET中执行此操作。

尽管您希望做些傻事,但事实并非如此。您遇到了一些破坏交易的权限问题。如果您将浏览Mike O'Brien的代码来自Hid库的GitHub,您将看到它调用位于以下位置的Win32 API函数:kernel32.dll、setupapi.dll、user32.dll、Hid.dll()

枚举本身是通过setupapi.dll函数完成的。它浏览所有已安装的设备并过滤所需的内容

所以…我认为在IIS中通过匿名身份验证直接从web应用程序执行kernel32.dll代码是一个安全问题,不是吗


如果您真的需要与HID通信(谁知道可能是温度传感器或其他东西)我将使用单独的Windows服务,IIS托管的web应用程序将通过WCF与此服务进行通信。此服务需要一个代理。

@Chase,除非这是一个实验-最好不要尝试从IIS进程连接到设备。[如果沿着此路径启动,这是潘多拉的盒子]

最好的方法是使用另一个(WCF)服务作为设备的代理,并公开您需要的服务,将其连接到您的应用程序。如果您认为有帮助,请随时询问示例


I+1@garzanti。

您可以尝试以本地管理员帐户的身份运行您的IIS工作进程(和经过身份验证的用户帐户),以排除权限问题。此项目背后的想法是构建一个专门构建的“设备”(缺少更好的术语)这在前端公开了一个webUI,并为自动化目的控制硬件…类似于快思聪在其AV2硬件上所做的。我同意服务方法-这是我在此类场景中一直使用的做法。请参阅我在原始问题上发表的评论。“设备”这是一个很好的术语,对于这种情况,有一个Windows 2008嵌入式版本。但即使如此,WebUI也应该与硬件服务隔离。同意。我将对此进行调查(过去几天没有机会)。我希望为希望使用该项目的人提供简单的部署(它将在github上启动),并且必须部署WebUI和Windows服务对最终用户来说要比我所期望的付出更多的努力……但我想必须是这样。请参阅我在原始问题上发表的评论。