【问题标题】:SignalR An asynchronous operation errorSignalR 异步操作错误
【发布时间】:2013-07-04 06:18:30
【问题描述】:

我使用的是 SignalR 1.1.2,但异步集线器方法有问题。使用 ForeverFrame 传输在我的 PC 上一切正常,但在服务器上部署并切换到 Web 套接字传输后,我收到以下错误:

此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果在执行 Page 时发生此异常,请确保将 Page 标记为 。

我的hub方法代码:

public async Task<string> getUrl()
    {
        var url = await MyWebservice.GetMyRoomUrlAsync(Context.User.Identity.Name);

        return url;
    }

SignalR 中是否支持带有网络套接字传输的异步方法?

更新: GetMyRoomUrlAsync 代码:

public static Task<string> GetMyRoomUrlAsync(string email)
    {
        var tcs = new TaskCompletionSource<string>();

        var client = new Onif40.VisualStudioGeneratedSoapClient();

        client.GetRoomUrlCompleted += (s, e) =>
        {
            if (e.Error != null)
                tcs.TrySetException(e.Error);
            else if (e.Cancelled)
                tcs.TrySetCanceled();
            else
                tcs.TrySetResult(e.Result);
        };

        client.GetRoomUrlAsync(email);

        return tcs.Task;
    }

在 Stephen Cleary 向我澄清问题出在哪里后,通过将 EAP 重写为 APM 来解决问题是微不足道的。

public static Task<string> GetMyRoomUrlAsync(string email)
    {
        var tcs = new TaskCompletionSource<string>();

        var client = new Onif40.VisualStudioGeneratedSoapClient();

        client.BeginGetRoomUrl(email, iar =>
        {
            try
            {
                tcs.TrySetResult(client.EndGetRoomUrl(iar));
            }
            catch (Exception e)
            {
                tcs.TrySetException(e);
            }
        }, null);

        return tcs.Task;
    }

【问题讨论】:

  • 很抱歉问你一件事。我知道 EAP 是指基于事件的异步模式,但 APM 是指异步流程管理吗?
  • 不,APM 表示异步编程模型 (msdn.microsoft.com/en-us/library/ms228963.aspx)
  • 感谢马丁。您的 GetMyRoomUrlAsync() 函数代码有点难以理解。可能所有代码都不存在。何时调用 GetRoomUrlCompleted() 委托?后来你改变了方法,因为在后面的示例中你使用 BeginGetRoomUrl()。
  • 第二个示例中没有 GetRoomUrlComleted(),因为它显示了使用 BeginMethod 和 EndMethod 的 APM 模式...如果您的意思是在 web 服务检索到 url 后调用的代码在哪里然后是 iar => { .... }

标签: asp.net signalr .net-4.5


【解决方案1】:

支持async 方法。但是,您不能在 EAP methods 周围使用 async voidasync 包装器。

造成这种情况的一个常见原因是使用WebClient 而不是较新的HttpClient。如果这里不是这种情况,您需要发布GetMyRoomUrlAsync 的实现。

【讨论】:

  • 我在 GetMyRoomUrlAsync 中使用 EAP 方法,但让我感到困惑的是,它在不使用 websocket 传输时工作正常。
  • 在您的 web.config 中,您是否在 httpRuntime 上将 targetFramework 设置为 4.5?
  • 是的,我愿意。我从标准 ASP.NET 页面(使用 async=true)调用此方法没有任何问题。我仍然怀疑传输,所以我将尝试使用指定的 websockets 以外的其他传输调用异步方法。不幸的是,我不能这样做,但我稍后会发布我的结果。
  • 如果 async 方法在 HTTP 请求的上下文中执行,则不会引发此异常。 WebSocket 使用不同的上下文,这会导致此异常。不过,我同意行为上的差异可能会造成混淆,我会向 SignalR 团队提出问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2023-03-31
  • 2017-06-29
  • 2018-10-30
  • 1970-01-01
相关资源
最近更新 更多