Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 尝试发出WebSocket请求时,HttpContext.Current.Session在aync任务中为null_Javascript_C#_Asp.net_Websocket_Generic Handler - Fatal编程技术网

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

Javascript 尝试发出WebSocket请求时,HttpContext.Current.Session在aync任务中为null,javascript,c#,asp.net,websocket,generic-handler,Javascript,C#,Asp.net,Websocket,Generic Handler,我正在使用通用处理程序创建从客户端到服务器的WebSocket请求 HttpContext.Current.Session在任务方法中为空 我的服务器代码是 <%@ WebHandler Language="C#" Class="SyncDataHandler" %> using System; using System.Web; using System.Net.WebSockets; using System.Threading; using System.Threading.

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

HttpContext.Current.Session
在任务方法中为空

我的服务器代码是

<%@ 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;
        }
    }

}

使用制度;
使用System.Web;
使用System.Net.WebSockets;
使用系统线程;
使用System.Threading.Tasks;
使用System.Web.Script.Serialization;
使用系统文本;
使用System.Web.SessionState;
公共类SyncDataHandler:IHttpHandler,iRequiresessionState
{
公共void ProcessRequest(HttpContext上下文)
{
if(context.IsWebSocketRequest)
{
AcceptWebSocketRequest(SyncDataTask);
}
}
公共静态字符串getLastComment()
{
返回新的JavaScriptSerializer().Serialize(DH_Details.GetLastComment());
}
公共异步任务SyncDataTask(WebSocketContext上下文)
{
WebSocket套接字=context.WebSocket;
var x=HttpContext.Current.Session;//x为null为什么???
while(true)
{
系统线程线程睡眠(1000);
ArraySegment缓冲区=新的ArraySegment(新字节[1024]);
//如果套接字仍然打开,则将消息回显到客户端
if(socket.State==WebSocketState.Open)
{
字符串SyncedObject=getLastComment();
buffer=newarraysegment(Encoding.UTF8.GetBytes(SyncedObject));
//异步向客户端发送消息
wait socket.SendAsync(缓冲区,WebSocketMessageType.Text,
true,CancellationToken.None);
}
else{break;}
}
}
公共布尔可重用
{
得到
{
返回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>

我认为问题与此有关:

一种解决方法可能是替换以下项的
SyncDataTask
签名:

public async Task SyncDataTask(WebSocketContext context, HttpSessionState session)
然后替换此呼叫:

context.AcceptWebSocketRequest(SyncDataTask);
对于这一个:

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

我感谢您的帮助,但它不起作用:(请您和其他解决方案吗?我终于从会话中传递了一个我想要的对象不是所有会话对象,我让它起作用了,非常感谢:)