【问题标题】:SignalR Client Connection has been not establishedSignalR 客户端连接尚未建立
【发布时间】:2015-09-18 20:34:19
【问题描述】:

我创建了一个 SignalR 自托管应用程序,但无法通过浏览器或 Windows Phone(这是我的客户端)访问。我遵循了几个教程,他们几乎说同样的话,我相信错误出在我的网络配置上,还请注意,当您运行项目时,IIS 不会触发(不确定是否还需要)。

信号服务器:

class Program : Hub
    {
        private static HubConnection Connection { get; set; }
        private static IHubProxy HubProxy { get; set; }

        const string Url = "http://*:8080";

        static void Main(string[] args)
        {
            // This will *ONLY* bind to localhost, if you want to bind to all addresses
            // use http://*:8080 to bind to all addresses. 
            // See http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx 
            // for more information.

            using (WebApp.Start(Url))
            {
                Console.WriteLine("Servidor rodando em {0}", Url);
                Console.ReadLine();
            }
        }

        private static void Connection_Closed()
        {
            Connection = null;
        }
    }

    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCors(CorsOptions.AllowAll);
            app.MapSignalR();
        }
    }

错误是:

连接尚未建立。

我的客户类:

public class SignalRService : PhoneApplicationPage
    {
        public String UserName { get; set; }

        public IHubProxy HubProxy { get; set; }

        private const string ServerURI = "http://localhost:8080";

        public HubConnection Connection { get; set; }

        public SignalRService()
        {
            UserName = "Luizaooo";

            ConnectAsync();
        }

        public void ObterAtualizacoesProdutos()
        {
            ProdutoService produtoService = new ProdutoService();
            var dataHora = produtoService.ObterDataHoraUltimaAtualizacao();
            HubProxy.Invoke("ObterAtualizacoes", dataHora);
            MessageBox.Show("passou");
        }

        private async void ConnectAsync()
        {
            Connection = new HubConnection(ServerURI);
            Connection.Closed += Connection_Closed;
            HubProxy = Connection.CreateHubProxy("ProdutoHub");

            HubProxy.On<List<Produto>>("AtualizarProdutos", (ListaDeProdutos) =>
                this.Dispatcher.BeginInvoke(() =>
                {
                    var a = ListaDeProdutos;
                }));

            try
            {
                await Connection.Start();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                return;
            }
        }

        private void Connection_Closed()
        {
            Connection = null;
        }
    }

【问题讨论】:

    标签: c# signalr signalr-hub signalr.client


    【解决方案1】:

    要正确识别Startup 类可能很棘手,尤其是在自托管场景中。

    对于您的代码,首先检查Configuration 方法是否实际运行。如果不是,请添加

    [assembly: OwinStartup(typeof(Program.Startup))]
    

    namespace 声明之上,如下所述:Owin Startup Detection

    您可以通过使用带有谓词的WebApp.Start 的重载来完全绕过这个问题:

     WebApp.Start(url, new Action<IAppBuilder>((app) =>
     {
         app.UseCors(CorsOptions.AllowAll);
         app.MapSignalR();
     }));
    

    无论哪种方式,通过导航到 http://localhost:8080/signalr/hubs 来测试您的连接。如果这向您显示了一个 signalR javascript 文件,您将知道您的服务已启动并正在运行

    【讨论】:

    • 我正在启动 windows phone 项目,但模拟器无法访问地址... localhost:8080 或直接设置的 ip。但是测试vc说的url,他要求下载文件,应该是你说的JS,浏览器正常显示JS。但不幸的是,我只是遇到了网络问题,无法进行实际测试。
    • @LuizNegrini 您可能需要检查您的应用清单,看看您是否需要网络权限
    • signalr/hubs中出现javascript不代表项目设置为asp.net mvc?因为我的客户项目是windows phone silverlight。
    • @LuizNegrini 出现的 javascript 意味着您的服务器已正确托管并正在侦听连接。它可以被网站用来生成代理,但它只是告诉你什么是有效的。很遗憾,我看不出您的手机项目失败的任何明显原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多