【发布时间】: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