4

この単純な Web ソケットの例では、200 エラーが返されます。

編集:この問題が発生している理由について、より多くの人が私にアドバイスできることを期待して、C# でコードを再投稿しています。

ローカル IIS マシンで VS2012 Express を実行しています。プロジェクトは 4.5.1 フレームワーク用に構成されており、Nuget Microsoft.Websockets パッケージをインポートしました。

以下に示す 3 つのコードは、プロジェクト内の 3 つのコードのみであり、プロジェクトの残りの部分には変更を加えていません。

予期しないエラーの前に中断はありません。どちらの側でも開いたりメッセージを中断したりしません。200 は Chrome コンソールのエラーとして表示されますが、応答のプレビューはありません。

クライアント (index.htm) は次のとおりです。

    <!doctype html>
    <html>
    <head>

    <title></title>
    <script src="Scripts/jquery-1.8.1.js" type="text/javascript"></script>
    <script src="test.js" type="text/javascript"></script>

    </head>


    <body>
    <input id="txtMessage" />
    <input id="cmdSend" type="button" value="Send" />
    <input id="cmdLeave" type="button" value="Leave" />
    <br />
    <div id="chatMessages" />
    </body>


    </html>

およびクライアント スクリプト (test.js):

$(document).ready(function () {

    var name = prompt('what is your name?:');

    var url = 'ws://' + window.location.hostname + window.location.pathname.replace('index.htm', 'ws.ashx') + '?name=' + name;

    alert('Connecting to: ' + url);

    var ws = new WebSocket(url);

    ws.onopen = function () {
        $('#messages').prepend('Connected <br/>');
        $('#cmdSend').click(function () {
            ws.send($('#txtMessage').val());
            $('#txtMessage').val('');
        });
    };

    ws.onmessage = function (e) {
        $('#chatMessages').prepend(e.data + '<br/>');
    };

    $('#cmdLeave').click(function () {
        ws.close();
    });

    ws.onclose = function () {
        $('#chatMessages').prepend('Closed <br/>');
    };

    ws.onerror = function (e) {
        $('#chatMessages').prepend('Oops something went wrong<br/>');
    };

});

一般的なハンドラー (ws.ashx) は次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.Web.WebSockets;
namespace WebSockets
{
    public class ws : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            if (context.IsWebSocketRequest)
                context.AcceptWebSocketRequest(new TestWebSocketHandler());
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

クラス (TestWebSocketHandler) は次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
using Microsoft.Web.WebSockets;
namespace WebSockets
{
    public class TestWebSocketHandler : WebSocketHandler
    {
        private static WebSocketCollection clients = new WebSocketCollection();
        private string name;

        public override void OnOpen()
        {
            this.name = this.WebSocketContext.QueryString["name"];
            clients.Add(this);
            clients.Broadcast(name + " has connected.");
        }

        public override void OnMessage(string message)
        {
            clients.Broadcast(string.Format("{0} said: {1}", name, message));
        }

        public override void OnClose()
        {
            clients.Remove(this);
            clients.Broadcast(string.Format("{0} has gone away.", name));
        }

    }
}
4

4 に答える 4

3

この問題の影響によるエラーは発生しませんでしたが、Chrome が 200 応答と一緒に返せなかったエラーを見つけました。

I simply had to turn on the WebSocket protocol under Control Panel --> Programs --> Turn Windows Features on or Off --> IIS --> Application Development Features --> WebSocket Protocol.

At very least I've added a simple VB.NET WebSocket to the site.

Just make sure you have IIS 7+ and are running windows 8 in the 4.5 Framework...and to turn on the WebSocket feature above.

于 2013-09-26T21:47:00.783 に答える
-3

ウィキペディアでこれを見つけました:

200 OK HTTP 要求が成功した場合の標準応答。実際の応答は、使用するリクエスト メソッドによって異なります。GET リクエストでは、リクエストされたリソースに対応するエンティティがレスポンスに含まれます。POST リクエストでは、アクションの結果を記述または含むエンティティが応答に含まれます。

于 2013-09-26T19:58:58.457 に答える