如何将自定义媒体类型格式化程序用于信号器消息内容?

时间:2014-03-13 16:30:56

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

我正在尝试使用自定义媒体类型格式化程序来实现(部分)Web API服务的版本控制。这适用于标准Web API控制器方法。该服务还使用SignalR通知连接的客户端某些更改。在Hub的相关代码下面:

    public void BroadCastAnalyzerGroupRemoved(string groupId)
    {
        hubContext.Clients.All.AnalyzerGroupRemoved(
            new AnalyzerGroupRemovedMessage() 
            { 
                AnalyzerGroupId = groupId 
            });
    }

不使用自定义媒体类型格式化程序,这很好用。从HttpConfiguration中删除所有格式化程序并仅添加我自定义的格式化程序时,上面的代码会引发以下异常:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException occurred
  _HResult=-2146233088
  _message='Microsoft.AspNet.SignalR.Hubs.ClientProxy' does not contain a definition for 'AnalyzerGroupRemoved'
  HResult=-2146233088
  IsTransient=false
  Message='Microsoft.AspNet.SignalR.Hubs.ClientProxy' does not contain a definition for 'AnalyzerGroupRemoved'
  Source=Microsoft.CSharp
  StackTrace:
       at Microsoft.CSharp.RuntimeBinder.RuntimeBinderController.SubmitError(CError pError)
  InnerException: 

用于配置格式化程序的代码如下所示:

        config.Formatters.Clear();
        var formatters = container.Resolve<IEnumerable<MediaTypeFormatter>>();
        formatters.ForEach(f => config.Formatters.Add(f));

container对象是包含所有自定义媒体类型格式化程序的Autofac容器。

我已经确认已创建AnalyzerGroupRemovedMessage的媒体类型格式化程序并将其添加到容器中。

我是否需要在客户端注册时添加一些代码? 目前注册的代码如下所示:

    [Test]
    public async Task TestRemovingAGroupNotifiesClients()
    {
        var hubConnection = new HubConnection(uriBuilder.SignalRHubUri, useDefaultUrl: false);
        hubConnection.Error += ex => { throw new Exception("Exception from hubConnection",ex); };
        hubConnection.TraceLevel = TraceLevels.All;
        hubConnection.TraceWriter = new DebugTextWriter();
        var proxy = hubConnection.CreateHubProxy("AnalyzerGroupsHub");
        const string groupId = "138"; 
        var eventWasRecieved = new AutoResetEvent(false);
        string groupIdRecieved = null;
        proxy.On<AnalyzerGroupRemovedMessage>("AnalyzerGroupRemoved", message =>
        {
            groupIdRecieved =  message.AnalyzerGroupId;
            eventWasRecieved.Set();
        });
        hubConnection.Start().Wait();
        var removeResult = await RequestHelper.InvokeWebRequest(
            uriBuilder.AnalyzerGroupUri(groupId),
            HttpMethod.Delete);
        Assert.AreEqual(HttpStatusCode.NoContent, removeResult.StatusCode);
        var waitResult = eventWasRecieved.WaitOne(TimeSpan.FromSeconds(1));
        Assert.IsTrue(waitResult);
        Assert.AreEqual(groupId, groupIdRecieved);
    }

我无法在互联网上找到有关此主题的任何信息,任何对资源的指示也将非常感激。

0 个答案:

没有答案