2012-10-02 39 views
1

所有在线博客都参考了带有旧命名空间和使用nuget软件包的测试版。我试图得到一个简单的低级别的websockets示例,基于野外现在的情况,它只是不工作。WebSockets - ASP.NET 4.5 IIS 8最终版本

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

但是,我知道该请求正在接收,因为我把代码放在我的ashx处理程序中向我发送电子邮件在不同点只是为了确认该请求在未来,我的任务是射击等

配置 - 所有最终发行版本:8/ASP.NET 4.5

我的样品是基于 的Windows Server 2012/IIS : 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 protected]"); 
      message.Subject = "Handler"; 
      message.From = new System.Net.Mail.MailAddress("[email protected]"); 
      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> 

任何人有任何意见或另一种简单的这样的样本被证实可以与最终发布的东西一起工作。感谢您花时间阅读并回复。

回答

0

我可以让你的代码在你的代码中做一些改变。
您可能不需要在您的环境中执行以下所有更改。
在服务器端

  • 把try catch块左右SMTP代码
  • 验证context.IsWebSocketConnection是真的
  • 如果(context.IsWebSocketRequest)
    {
    context.AcceptWebSocketRequest(MyWebSocketTask);
    }
    else
    {
    throw new HttpException(“This is not a WebSocket request!”);
    }

    在客户端:
    我根据错误,我得到了:)改变代码像下面。 此代码也将在IISExpress 8中运行。
    VAR wsUri = “WS:// <%:Request.Url.Host%>:<%:Request.Url.Port%> <%: Response.ApplyAppPathModifier(” 〜/ wshandler.ashx“)

    1. 内部形式加入serverData像的下方。 <表格ID = “form1的” RUNAT = “服务器” >
      < DIV ID = “serverData” > < /格>
      </FORM>
      ,并用它在writeToScreen()函数上。
      function writeToScreen(message){
      var serverData = document.getElementById(“serverData”);
      var newElem = document.createElement(“p”);
      newElem.style.wordWrap =“break-word”;
      newElem.innerHTML = message;
      serverData.insertBefore(newElem,serverData.firstChild);
      }
    2. onMessage()函数关闭客户端的连接。所以只发送和接收一条消息。
    3. 确保IE10浏览器的文档模式是“标准”。我使用IE10来测试你的代码。
    +0

    谢谢阿南德!不幸的是,我实施了您的更改,但仍然无效。同样的行为。我还在if(socket.State == WebSocketState.Open)块中移动了smtp,甚至从未生成过电子邮件。你是在对ws://iis8hosting.com:80/mikey/wshandler.ashx进行测试,还是仅在本地使用此代码进行测试?除了启用webosocket服务器端之外,还有其他的东西是必须要做的吗? – user1713321

    +0

    我在我的win8盒子上本地尝试过。那么它看起来像你的win8服务器没有正确配置web套接字。 – Anand

    +1

    @ user1713321 - 客户端和服务器之间是否有代理或防火墙?大多数代理和防火墙都不允许WebSockets连接,并会拒绝它们。尝试确保客户端与服务器有直接连接。 – Levi