【问题标题】:401 Unauthorized error or no message return in SignalR for WinForms401 未经授权的错误或在 SignalR for WinForms 中没有返回消息
【发布时间】:2019-10-01 11:20:41
【问题描述】:

我正在尝试在 MVC 服务器端和 WinForms 客户端之间创建简单的 SignalR 集线器。

我创建了 NotificationHub 类,指定如下:

using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;

namespace PF.Timesheet.Service
{
    public class NotificationHub : Hub
    {
        public void Send(string name, string message)
        {
            Clients.All.broadcastMessage(name, message);
        }

        public override Task OnConnected()
        {

            return base.OnConnected();
        }
    }
}

而客户端的代码是这样的:

var hubConnection = new HubConnection("http://localhost:30341/singalr");
var chat = hubConnection.CreateHubProxy("NotificationHub");

string message2 = string.Empty;

chat.On<string, string>("broadcastMessage", (name, message) => { message2 = message; });

chat.On<string, string>("broadcastMessage", (name, message) =>
        this.Invoke((Action)(() =>
           RichTextBoxConsole.AppendText(String.Format("{0}: {1}" + Environment.NewLine, name, message)));

hubConnection.Start().Wait();

我试图以任何可能的方式从广播消息中获取消息,无论是通过将其分配给某个字符串变量“message2”还是通过将文本附加到 UI 上的富文本框控件。

如果我这样打电话:

hubConnection.Start().Wait();

我将从信号器自托管的 localhost 收到 401 Unauthorized 响应。 (本地主机与客户端 WinForms 应用程序在同一项目中作为不同的解决方案并行运行)。

我在服务器端尝试做的是将消息从这样的代码推送到集线器:

  var context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
  context.Clients.All.broadcastMessage("NAM", "New entry created.");

如果我从 hubConnection.Start(); 中删除 Wait(),我不会收到 Unauthorized 401 错误,但也不会收到消息值。

有人看到我在这里做错了吗?

到目前为止我尝试过的事情:

  1. 尝试将EnableDetailedErrorsEnableJSONP 属性设置为true。我在某处读到 SignalR 集线器默认具有 [Authorized] 属性,并且此配置应该有所帮助。
    public class Startup
    {
       public void Configuration(IAppBuilder app)
       {
           HttpConfiguration config = new HttpConfiguration();
           WebApiConfig.Register(config);
           DependencyConfig.Initialize(config);
           Loging.Initialize();
           app.UseWebApi(config);
           app.MapSignalR(new HubConfiguration
           {
               EnableDetailedErrors = true,
               EnableJSONP = true
           });
        }
     }
  1. 尝试将服务器项目的WindowsAuthAnonymousAuth 属性设置为Enabled

  1. 使用时检查消息是否实际推送到集线器:

    context.Clients.All.broadcastMessage("NAM", "New entry created.");

消息在那里。

是否有人通过未经授权的问题并能够从 MVC Server SignalR 集线器读取消息到 WinForms 客户端?

【问题讨论】:

  • 可能不相关,但集线器 uri 中似乎有错字
  • @LennartStoop 感谢您的回答。你指的是哪个错别字?也许我错过了像那样愚蠢的东西。
  • 我指的是客户端的uri:不应该是signalr而不是singalr吗?
  • @LennartStoop 修复了那个,但问题仍然存在。 :(
  • 如果您在没有.Wait() 的情况下运行,您不会得到异常的原因是hubConnection.Start() 返回一个Task,要么需要awaited,要么是.Wait()ed,或者它永远不会运行。因此,当您忽略它时,它不会尝试连接(而且您也不会收到广播消息)。

标签: c# asp.net-mvc winforms signalr


【解决方案1】:

我自己设法解决了这个问题。问题是该服务器(之前已经设置,而不是由我设置)具有用户名和密码的基本身份验证。 这对于任何 [Authorization] 属性或任何东西都完全不可见,但它仍然存在。

我通过在 hubConfiguration 上设置 Credentials 属性解决了这个问题:

hubConnection.Credentials = new NetworkCredential("user.name", "password");

身份验证和与集线器的连接成功,消息已从服务器返回到客户端。

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    相关资源
    最近更新 更多