javascript - 尝试发出 WebSocket 请求时,在 aync 任务中 HttpContext.Current.Session 为 null

标签 javascript c# asp.net websocket generic-handler

我正在使用通用处理程序创建从客户端到服务器的 WebSocket 请求

HttpContext.Current.Session 在任务方法内为 null

我的服务器代码是

<%@ WebHandler Language="C#" Class="SyncDataHandler" %>

using System;
using System.Web;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using System.Text;
using System.Web.SessionState;

public class SyncDataHandler : IHttpHandler, IRequiresSessionState
{

    public void ProcessRequest(HttpContext context)
    {
        if (context.IsWebSocketRequest)
        {
            context.AcceptWebSocketRequest(SyncDataTask);
        }
    }

    public static string getLastComment()
    {
        return new JavaScriptSerializer().Serialize(DH_Details.GetLastComment());
    }

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

        var x = HttpContext.Current.Session; // x is null why ???

        while (true)
        {
            System.Threading.Thread.Sleep(1000);
            ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);

            // If the socket is still open, echo the message back to the client
            if (socket.State == WebSocketState.Open)
            {

                string SyncedObject = getLastComment();

                buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(SyncedObject));

                // Asynchronously send a message to the client
                await socket.SendAsync(buffer, WebSocketMessageType.Text,
                        true, CancellationToken.None);
            }
            else { break; }
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}

我的网络配置

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5">
      <assemblies>
        <add assembly="System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
        <add assembly="Microsoft.TeamFoundation.WorkItemTracking.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
        <add assembly="Microsoft.TeamFoundation.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
      </assemblies>
    </compilation>
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <appSettings>
    <add key="TFS_URL" value="http://192.168.1.10:8080/tfs/"/>
    <add key="serverPath" value="D:/"/>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
    <add key="ValidationSettings:UnobtrusiveValidationMode" value="WebForms" />
  </appSettings>
</configuration>

最佳答案

我认为问题与此有关:The cross-thread usage of "HttpContext.Current" property and related things

解决方法可能是将 SyncDataTask 签名替换为:

public async Task SyncDataTask(WebSocketContext context, HttpSessionState session)

然后替换这个调用:

context.AcceptWebSocketRequest(SyncDataTask);

对于这个:

context.AcceptWebSocketRequest(wsc => SyncDataTask(wsc, context.Session));

关于javascript - 尝试发出 WebSocket 请求时,在 aync 任务中 HttpContext.Current.Session 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27421450/

相关文章:

javascript - jquery 偏移顶部错误值,但在页面调整大小时正确

c# - File.Open 跨线程编写

javascript - 如何在使用数据注释时合并 Bootstrap has-error 类

c# - 我如何将 ActionLink "Add Pictures"放在导航栏的中间?

c# - 可以在此多线程循环实现中正确使用互锁的CompareExchange吗?

c# - 如何将项目添加到列表

c# - System.Configuration.ConfigurationException 在 Windows Server 2012 上运行基于 .NET 4.0 的服务构建时

javascript - 使用 jQuery 在 url 中 append (添加)文本

javascript - 如何更新具有相同父值的同一级别中的所有现有元素?

javascript - 如何解决 DOM hierarchy,Uncaught DOMException : Failed to execute '$x'