发送对象到.NET SignalR客户端时出错。

3

我理解的是,使用SignalR,我可以直接发送对象。我正在尝试建立一个.NET客户端来接收网站上已下单的通知。我正在建立一个非常简单的示例以便我能理解这些概念。当我将字符串通知发送回客户端时,它运行得非常好,但是当我尝试发送一个对象时,我遇到了错误:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException was unhandled by user code
  HResult=-2146233088
  Message=The best overloaded method match for 'ConsoleHub.Program.DisplayOrder(ConsoleHub.Order)' has some invalid arguments
  Source=Anonymously Hosted DynamicMethods Assembly
  StackTrace:
       at CallSite.Target(Closure , CallSite , Type , Object )
       at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite site, T0 arg0, T1 arg1)
       at ConsoleHub.Program.<Main>b__6(Object o) in c:\Working\OrderNotifier\ConsoleHub\Program.cs:line 23
       at Microsoft.AspNet.SignalR.Client.Hubs.HubProxyExtensions.<>c__DisplayClass6`1.<On>b__4(JToken[] args)
       at Microsoft.AspNet.SignalR.Client.Hubs.Subscription.OnData(JToken[] data)
       at Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.InvokeEvent(String eventName, JToken[] args)
       at Microsoft.AspNet.SignalR.Client.Hubs.HubConnection.OnReceived(JToken message)
       at Microsoft.AspNet.SignalR.Client.Connection.Microsoft.AspNet.SignalR.Client.IConnection.OnReceived(JToken message)
       at Microsoft.AspNet.SignalR.Client.Transports.HttpBasedTransport.ProcessResponse(IConnection connection, String response, Boolean& timedOut, Boolean& disconnected)
  InnerException: 

我的班级:

public class Order
{
    public int OrderId { get; set; }
    public string Name { get; set; }
    public string OrderItem { get; set; }
}

我的中心:

using Microsoft.AspNet.SignalR.Hubs;
using OrderNotifier.Models;
using System.Linq;
using System.Threading.Tasks;

namespace OrderNotifier.Hubs
{

    public class NotifierHub : Hub
    {
        OrderContext db = new OrderContext();

        public void Hello()
        {
            Clients.Caller.Welcome("hello");
        }

    }
}

我的控制器操作:

    [HttpPost]
    public ActionResult Create(Order order)
    {
        if (ModelState.IsValid)
        {
            db.Orders.Add(order);
            db.SaveChanges();

            SendNotifier.SendOrderNotification(String.Format("{0} ordered {1}", order.Name, order.OrderItem), order);
            return RedirectToAction("Index");
        }

        return View(order);
    }

SendNotifier - 这有点奇怪,因为我在测试中让它同时发送一个字符串版本和一个对象版本:

public class SendNotifier
{
    public static void SendOrderNotification(string message, Order order)
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<NotifierHub>();
        context.Clients.All.Notify(message);
        context.Clients.All.Order(order);
    }
}

我的控制台应用程序:
using Microsoft.AspNet.SignalR.Client.Hubs;
using OrderNotifier.Models;
using System;


namespace ConsoleHub
{
    class Program
    {
        static void Main(string[] args)
        {
            var hubConnection = new HubConnection("http://localhost:60692");

            var order = hubConnection.CreateHubProxy("NotifierHub");

            //
            // Set up action handlers
            //
            order.On("Welcome", message => Console.WriteLine(message));
            order.On("Notify", message => Console.WriteLine(message));
            order.On("Order", o => DisplayOrder(o));
            hubConnection.Start().Wait();

            order.Invoke("Hello").Wait();


            Console.WriteLine("Initialized...");
            Console.ReadLine();
        }


        public void DisplayOrder(Order o)
        {
            Console.WriteLine(String.Format("Order object received.../r/nOrderId: {0}/r/nName: {1}/r/nOrderItem: {2}", o.OrderId, o.Name, o.OrderItem));
            //Console.WriteLine(o);
        }
    }
}

如果我将DisplayOrder参数更改为字符串,它就可以正常工作。我知道我可能可以使用Json.Net手动反序列化它,但我的理解是我应该只需将其视为对象并让signalr进行反序列化。我错过了什么吗?
1个回答

4
您正在使用On的动态对象重载。您需要指定类型:
order.On<Order>("Order", DisplayOrder);

2
看到这里,我讨厌自己做傻事。我在文档中看到了那个语法并尝试使用它,但它无法编译。问题是我刚刚在Main中声明了DisplayOrder,因为它不是静态的,所以它无法编译。我将其更改为静态的display order,现在它完美地工作了。感谢您指引我回到正确的方向。就记录而言,我对signalr印象非常深刻。你们做得很好! - pcbliss
先生,你刚刚为我节省了超过30分钟的调试时间。谢谢 :) - Lynn Crumbling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接