Asp.net mvc MVC异步控制器阻塞

Asp.net mvc MVC异步控制器阻塞,asp.net-mvc,async-await,Asp.net Mvc,Async Await,所以我一直在关注Steven Sanderson关于SignalR和ASP.NET Async的文章。我在以下操作中遇到问题 public class SomeController : AsyncController { static TaskCompletionSource<String> _nextMessage = new TaskCompletionSource<string>(); [HttpPost] public A

所以我一直在关注Steven Sanderson关于SignalR和ASP.NET Async的文章。我在以下操作中遇到问题

public class SomeController : AsyncController
{
    static TaskCompletionSource<String> _nextMessage
        = new TaskCompletionSource<string>();

    [HttpPost]
    public ActionResult PostMessage(string message)
    {            
        _nextMessage = new TaskCompletionSource<string>();
        oldNextMessage.SetResult(message);
        return Content("success");
    }

    public async void GetMessages()
    {
        Response.ContentType = "text/event-stream";
        while (true)
        {
            var message = await _nextMessage.Task;
            Response.Write("data: " + message + "\n\n");
            Response.Flush();
        }

    }
}
但它不允许我从我的开发机器上的任何地方(包括浏览器的其他实例)调用PostMessage,因此这可能是线程问题,但我认为这的全部目的是允许线程处理多个事情。除此之外,在它第一次超时后,它开始按预期工作,我可以在那里发布,并立即得到回复。但是如果我刷新页面,我会遇到同样的问题。有没有办法解决这个问题?顺便说一下,我使用的是Eventsource,但当我进行长时间轮询时,也会出现同样的问题

    public async Task<string> GetNextMessage()
    {

        return await _nextMessage.Task;
    }
public异步任务GetNextMessage()
{
return wait_nextMessage.Task;
}

通过一个调用GetNextMessage()的javascript循环函数

以下是我最后使用的

[SessionState(SessionStateBehavior.Disabled)]
public class SomeController : AsyncController
{
    static TaskCompletionSource<String> _nextMessage = 
        new TaskCompletionSource<string>();

    public void PostMessage(string message)
    {
        var CreationJObj = FormUtils.AsciiToJObject(Request.Form[0]);
        var CreationObj = FormUtils.FromJObject<MessageDisplayVO>(CreationJObj);
        Parallel.Invoke(() => { _nextMessage.SetResult(CreationObj.Message); });
        _nextMessage = new TaskCompletionSource<string>();

    }

    public async void GetMessages()
    {
        Response.ContentType = "text/event-stream";
        var oldMessage = _nextMessage;
        var message = await oldMessage.Task;
        Response.Write("data: " + message + "\n\n");
        Response.Flush();
    }
}
[SessionState(SessionStateBehavior.Disabled)]
公共类SomeController:AsyncController
{
静态TaskCompletionSource\u下一条消息=
新建TaskCompletionSource();
公共void PostMessage(字符串消息)
{
var CreationJObj=FormUtils.AsciiToJObject(Request.Form[0]);
var CreationObj=FormUtils.FromJObject(CreationJObj);
Parallel.Invoke(()=>{u nextMessage.SetResult(CreationObj.Message);});
_nextMessage=new TaskCompletionSource();
}
公共异步void GetMessages()
{
Response.ContentType=“文本/事件流”;
var oldMessage=_nextMessage;
var消息=等待旧消息。任务;
响应。写入(“数据:“+消息+”\n\n”);
Response.Flush();
}
}

以下是我最后使用的

[SessionState(SessionStateBehavior.Disabled)]
public class SomeController : AsyncController
{
    static TaskCompletionSource<String> _nextMessage = 
        new TaskCompletionSource<string>();

    public void PostMessage(string message)
    {
        var CreationJObj = FormUtils.AsciiToJObject(Request.Form[0]);
        var CreationObj = FormUtils.FromJObject<MessageDisplayVO>(CreationJObj);
        Parallel.Invoke(() => { _nextMessage.SetResult(CreationObj.Message); });
        _nextMessage = new TaskCompletionSource<string>();

    }

    public async void GetMessages()
    {
        Response.ContentType = "text/event-stream";
        var oldMessage = _nextMessage;
        var message = await oldMessage.Task;
        Response.Write("data: " + message + "\n\n");
        Response.Flush();
    }
}
[SessionState(SessionStateBehavior.Disabled)]
公共类SomeController:AsyncController
{
静态TaskCompletionSource\u下一条消息=
新建TaskCompletionSource();
公共void PostMessage(字符串消息)
{
var CreationJObj=FormUtils.AsciiToJObject(Request.Form[0]);
var CreationObj=FormUtils.FromJObject(CreationJObj);
Parallel.Invoke(()=>{u nextMessage.SetResult(CreationObj.Message);});
_nextMessage=new TaskCompletionSource();
}
公共异步void GetMessages()
{
Response.ContentType=“文本/事件流”;
var oldMessage=_nextMessage;
var消息=等待旧消息。任务;
响应。写入(“数据:“+消息+”\n\n”);
Response.Flush();
}
}

尝试禁用会话状态。如何在MVC4中禁用会话状态。Google让我失望。[SessionState(SessionStateBehavior.Disabled)]似乎我需要SessionState才能使任务正常工作。我认为禁用会话状态使我的控制器无法调用GetMessages和继续使用PostMessage。我最终得到了后bellowTry禁用会话状态。在MVC4中我该如何做到这一点。Google让我失望。[SessionState(SessionStateBehavior.Disabled)]似乎我需要SessionState才能使任务正常工作。我认为禁用会话状态使我的控制器无法调用GetMessages和继续使用PostMessage。我最后听到了一声惨叫