【问题标题】:Error 200 with websockets javascriptwebsockets javascript 出现错误 200
【发布时间】:2017-09-14 13:18:54
【问题描述】:

我正在使用一些 Arduino 和运动传感器开展一个项目。 arduino 将他们的数据发送到 azure 上的 IoThub。现在我有一个工作网页,它收集数据并在 SVG 平面图中显示它们。这个网页只包含一个 html 索引和一些与服务器对话的 JS 文件。现在我想在 ASP.net webapp 中实现它以添加更多功能。但现在它来了,我做的和普通网页完全一样。相同的 JS 文件等。但是现在当我运行应用程序时出现错误:

与“wss://sensordash-wa.azurewebsites.net/”的 WebSocket 连接失败:WebSocket 握手期间出错:意外响应代码:200

这是工作网页:

这是不工作的 asp.net webapp,具有完全相同的 JS 文件等:

我认为 Azure 端的一切都运行良好,但我在 asp.net 应用程序中缺少一些东西。 提前致谢!

Server.js:

const express = require('express');
const http = require('http');
const WebSocket = require('ws');
const moment = require('moment');
const path = require('path');
const iotHubClient = require('Scripts//iot-hub.js');

const app = express();

app.use(express.static(path.join(__dirname, 'public')));
app.use(function (req, res/*, next*/) {
  res.redirect('/');
});

const server = http.createServer(app);
const wss = new WebSocket.Server({ server });

// Broadcast to all.
wss.broadcast = function broadcast(data) {
  wss.clients.forEach(function each(client) {
    if (client.readyState === WebSocket.OPEN) {
      try {
        console.log('sending data ' + data);
        client.send(data);
      } catch (e) {
        console.error(e);
      }
    }
  });
};

var iotHubReader = new iotHubClient(process.env['Azure.IoT.IoTHub.ConnectionString'], process.env['Azure.IoT.IoTHub.ConsumerGroup']);
iotHubReader.startReadMessage(function (obj, date) {
  try {
    console.log(date);
    date = date || Date.now()
    wss.broadcast(JSON.stringify(Object.assign(obj, { time: moment.utc(date).format('YYYY:MM:DD[T]hh:mm:ss') })));
  } catch (err) {
    console.log(obj);
    console.error(err);
  }
});

var port = normalizePort(process.env.PORT || '3000');
server.listen(port, function listening() {
  console.log('Listening on %d', server.address().port);
});

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

文件夹结构:

脚本文件夹结构:

web.config:

<?xml version="1.0"?>

<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>


  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="LiveDash" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

  <appSettings>
    <add key="webpages:Enabled" value="false" />
  </appSettings>

  <system.webServer>
    <handlers>
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
      <add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
      <webSocket
     enabled="true"
     receiveBufferLimit="true"
     pingInterval="00:01:00">
      </webSocket>
      
    </handlers>
  </system.webServer>

  <system.web>
    <compilation>
      <assemblies>
        <add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
  </system.web>
</configuration>

【问题讨论】:

  • 您的 Server.js 是否部署在 azure web 应用程序上作为您的 websocket 服务器?我尝试通过var socket = new WebSocket("wss://sensordash-wa.azurewebsites.net"); 连接您的端点,我可以重现您的问题。我尝试构建我的 node.js 后端并部署到 azure Web 应用程序,然后在我的 Web 应用程序的“设置 > 应用程序设置”下启用 Web 套接字,然后我可以从本地的单个 html 文件接收数据.如果我误解了您的情况,请纠正我。此外,您可以为我们提供更多详细信息以缩小此问题的范围。
  • 是的,我的 Server.js 部署在 asp.net 应用程序中。我有同样的问题,我的单个 html 文件工作正常,但是当我在 .net 应用程序中执行此操作时,我遇到了这个问题。
  • 您能否分享您部署到 azure web 应用程序的 asp.net 应用程序的文件夹结构?
  • 大声笑,正如我们所说,我让它工作了(Websocket 现在连接)我只是没有收到传入的消息。
  • 但是@BruceChen 我不知道在哪里放置我的文件 Server.js 和 IoTHub.js

标签: asp.net .net azure websocket azure-web-app-service


【解决方案1】:

根据您的描述,我检查了这个问题并在我的 azure web 应用程序上进行了测试。根据我的测试,您可以使用 url 重写规则将请求重写为由 node.js 处理的特定路径。更多详情,您可以参考以下详情。

我的 Azure Web App 下的网站内容结构:

带有 url 重写规则的 Web.config:

MVC 视图页面:

测试结果:

【讨论】:

  • 谢谢先生!像魅力一样工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2017-01-01
  • 2021-09-02
  • 2013-08-02
  • 2014-07-09
相关资源
最近更新 更多