1

オンラインのすべてのブログは、古い名前空間のベータ版を参照しており、nuget パッケージを使用しています。単純な低レベルの websockets の例を現在の状況に基づいて取得しようとしていますが、機能していません。

クライアントは接続を確立できません。Chrome デバッグ コンソールからのエラーは次のとおりです。「ポート エラー: 接続を確立できませんでした。受信側が存在しません。」

ただし、ashx ハンドラーにコードを入れて、さまざまな時点でメールを送信して、リクエストが着信したことや、タスクが起動したことなどを確認したため、リクエストが受信されていることはわかっています。

構成 - すべての最終リリース バージョン: Windows Server 2012/IIS 8/ ASP.NET 4.5

私のサンプルは以下に基づいています: http://www.asp.net/vnext/overview/whitepapers/whats-new#_Toc318097383

ハンドラー:

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);

<h2>WebSocket Test</h2><div id="output"></div>

最終リリースのもので動作することが確認されている、このようなアイデアや別の簡単なサンプルを持っている人はいますか? 時間を割いて読んで回答していただきありがとうございます。

4

1 に答える 1

0

コードにいくつかの変更を加えて、コードを機能させることができます。
ご使用の環境で、以下のすべての変更を行う必要はない場合があります。
サーバー側

  • SMTPコードの周りにtrycatchブロックを配置します
  • context.IsWebSocketConnectionがtrueであることを確認します
  • if(context.IsWebSocketRequest)
    {
    context.AcceptWebSocketRequest(MyWebSocketTask);
    }
    else
    {
    throw new HttpException( "これはWebSocketリクエストではありません!");
    }

    クライアント側:
    発生したエラーに基づいて、以下のようにコードを変更しました:)。このコードはIISExpress8でも機能します。
    var wsUri = "ws:// <%:Request.Url.Host%>:<%:Request.Url.Port%> <%:Response.ApplyAppPathModifier("〜/ wshandler.ashx ")

    1. 以下のようなフォーム内にserverDataを追加しました。<form id = "form1" runat = "server">
      <div id = "serverData"> </ div>
      </ form>
      そしてwriteToScreen()関数で使用しました。
      function writeToScreen(message){
      var serverData = document.getElementById( "serverData");
      var newElem = document.createElement( "p");
      newElem.style.wordWrap = "break-word";
      newElem.innerHTML=メッセージ;
      serverData.insertBefore(newElem、serverData.firstChild);
      }
    2. onMessage()関数は、クライアント側からの接続を閉じます。したがって、1つのメッセージのみが送受信されます。
    3. IE10ブラウザのドキュメントモードが「標準」であることを確認してください。コードのテストにはIE10を使用しました。
    于 2012-10-02T20:18:50.913 に答える