我正在尝试使用自定义媒体类型格式化程序来实现(部分)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);
}
我无法在互联网上找到有关此主题的任何信息,任何对资源的指示也将非常感激。