WebSocket-ASP.NET 4.5 IIS 8最终版本

WebSocket-ASP.NET 4.5 IIS 8最终版本,websocket,asp.net-4.5,iis-8,Websocket,Asp.net 4.5,Iis 8,所有在线博客都参考了旧名称空间的测试版,并使用nuget软件包。我试图得到一个简单的低级别websockets的例子,这个例子是基于现在流行的东西,但它不起作用 客户端永远无法建立连接。chrome调试控制台的错误为: 端口错误:无法建立连接。接收端不存在 然而,我知道请求正在被接收,因为我在我的ashx处理程序中放入了代码,在不同的时间点给我发电子邮件,只是为了确认请求正在进入,我的任务正在启动等等 配置-所有最终版本: Windows Server 2012/IIS 8/ASP.NET 4.

所有在线博客都参考了旧名称空间的测试版,并使用nuget软件包。我试图得到一个简单的低级别websockets的例子,这个例子是基于现在流行的东西,但它不起作用

客户端永远无法建立连接。chrome调试控制台的错误为: 端口错误:无法建立连接。接收端不存在

然而,我知道请求正在被接收,因为我在我的ashx处理程序中放入了代码,在不同的时间点给我发电子邮件,只是为了确认请求正在进入,我的任务正在启动等等

配置-所有最终版本: Windows Server 2012/IIS 8/ASP.NET 4.5

我的样本基于:

处理程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.WebSockets;
using System.Net.WebSockets;
using System.Threading;
using System.Text;
using System.Threading.Tasks;

namespace myWebSocket
{
/// <summary>
/// Summary description for wsHandler
/// </summary>
public class wsHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        // context.Response.ContentType = "text/plain";
        // context.Response.Write("Hello World");


        context.AcceptWebSocketRequest(MyWebSocketTask);
    }

    public async Task MyWebSocketTask(WebSocketContext context)
    {
        WebSocket socket = context.WebSocket;


        while (true)
        {
            System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
            message.To.Add("email@address.com");
            message.Subject = "Handler";
            message.From = new System.Net.Mail.MailAddress("michaelo@hostcollective.com");
            message.Body = string.Format("Task Launched {0}", socket.State.ToString());
            System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("localhost");
            smtp.Send(message);


            ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);

            // Asynchronously wait for a message to arrive from a client
            WebSocketReceiveResult result =
                    await socket.ReceiveAsync(buffer, CancellationToken.None);

            // If the socket is still open, echo the message back to the client
            if (socket.State == WebSocketState.Open)
            {
                string userMessage = Encoding.UTF8.GetString(buffer.Array, 0,
                        result.Count);
                userMessage = "You sent: " + userMessage + " at " +
                        DateTime.Now.ToLongTimeString();
                buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(userMessage));

                // Asynchronously send a message to the client
                await socket.SendAsync(buffer, WebSocketMessageType.Text,
                        true, CancellationToken.None);
            }
            else { break; }
        }
    }
    public bool IsReusable
    {
        get
        {
            return true;
        }
    }
}
}
至于客户端,这是基于websockets.org上的内容的最简单的一个

<script language="javascript" type="text/javascript">

// var wsUri = "ws://echo.websocket.org/";
var wsUri = "ws://iis8hosting.com/mikey/wshandler.ashx";
var output;

function init() {
    output = document.getElementById("output");
    testWebSocket();
}

function testWebSocket() {
    websocket = new WebSocket(wsUri);       

    websocket.onopen = function (evt) { onOpen(evt) };
    websocket.onclose = function (evt) { onClose(evt) };
    websocket.onmessage = function (evt) { onMessage(evt) };
    websocket.onerror = function (evt) { onError(evt) };
}

function onOpen(evt) {
    writeToScreen("CONNECTED");
    doSend("WebSocket rocks");
}

function onClose(evt) {
    writeToScreen("DISCONNECTED");
}

function onMessage(evt) {
    writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data + '</span>');
    websocket.close();
}

function onError(evt) {
    writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
}

function doSend(message) {
    writeToScreen("SENT: " + message);
    websocket.send(message);
}

function writeToScreen(message) {
    var pre = document.createElement("p");
    pre.style.wordWrap = "break-word";
    pre.innerHTML = message;
    output.appendChild(pre);
}

window.addEventListener("load", init, false);


任何人都有任何想法或其他简单的例子,比如这个,它被确认可以用于最终发布的东西。感谢您抽出时间阅读并回复

我可以通过对代码进行一些更改使您的代码正常工作。您可能不需要在您的环境中执行以下所有更改。 在服务器端,在SMTP代码周围放置一个try-catch块,以验证context.IsWebSocketConnection是否为true 如果context.IsWebSocketRequest { context.AcceptWebSocketRequestMyWebSocketTask; } 其他的 { 抛出新的HttpException这不是WebSocket请求!; }

在客户端:我根据收到的错误更改了如下代码:。 这段代码也可以在IISExpress 8中使用。
var wsUri=ws://:谢谢你,阿南德!不幸的是,我实现了您的更改,但仍然不起作用。同样的行为。我还移动了if socket.State==WebSocketState.Open块中的smtp内容,甚至从未生成过电子邮件。您是针对ws://iis8hosting.com:80/mikey/wshandler.ashx进行测试,还是仅在本地使用此代码进行测试?除了在服务器端启用webosockets之外,还有什么必须做的吗?我在我的win8机器上进行了本地尝试。然后,您的win8服务器似乎没有正确配置web套接字。@user1713321-客户端和服务器之间是否有代理或防火墙?大多数代理和防火墙还不允许WebSocket连接,将拒绝它们。尝试确保客户端与服务器直接连接。问得好。我最初认为这可能也是一个问题,因此我尝试从服务器本身访问该页面,但遇到了相同的问题。在IIS上启用Freb日志,查看您在与websocket相关的日志中看到的错误类型。比如握手失败?
<h2>WebSocket Test</h2><div id="output"></div>