Jer*_*ian 9 c# asp.net signalr signalr.client
我们有一个.NET客户端,它使用SignalR来调用Server方法,但参数看起来非常大,对于这种情况如何解决呢?
客户代码:
public async Task FooAsync()
{
var hubConnection = new HubConnection(...);
await hubConnection.Start();
var hubProxy = hubConnection.CreateHubProcx("ValueHub");
//the content is very long, about 11776065 bytes (11MB)
var content = File.ReadAllText(...);
hubProxy.Invoke("Send", content);
...
}
Run Code Online (Sandbox Code Playgroud)
服务器代码:
[HubName("ValueHub")]
public class ValueHub : Hub
{
public void Send(string json)
{
}
}
Run Code Online (Sandbox Code Playgroud)
从异常堆栈和源代码中,我发现SignalR内部使用HttpClient
了FormUrlEncodedContent
类型HttpContent
,也许限制来自这里.
System.UriFormatException was unhandled
HResult=-2146233033
Message=Invalid URI: The Uri string is too long.
Source=System
StackTrace:
at System.UriHelper.EscapeString(String input, Int32 start, Int32 end, Char[] dest, Int32& destPos, Boolean isUriString, Char force1, Char force2, Char rsvd)
at System.Uri.EscapeDataString(String stringToEscape)
at System.Net.Http.FormUrlEncodedContent.Encode(String data)
at System.Net.Http.FormUrlEncodedContent.GetContentByteArray(IEnumerable`1 nameValueCollection)
at System.Net.Http.FormUrlEncodedContent..ctor(IEnumerable`1 nameValueCollection)
at Microsoft.AspNet.SignalR.Client.Http.DefaultHttpClient.Post(String url, Action`1 prepareRequest, IDictionary`2 postData, Boolean isLongRunning)
at Microsoft.AspNet.SignalR.Client.Transports.HttpBasedTransport.Send(IConnection connection, String data, String connectionData)
at Microsoft.AspNet.SignalR.Client.Transports.AutoTransport.Send(IConnection connection, String data, String connectionData)
at Microsoft.AspNet.SignalR.Client.Connection.Send(String data)
at Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke[T](String method, Object[] args)
at Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke(String method, Object[] args)
Run Code Online (Sandbox Code Playgroud)
对这个问题有什么好的建议吗?
Ale*_*der 16
通过将MaxIncomingWebSocketMessageSize设置为null,可以在Startup.cs中添加一条使消息大小为"无限"的行:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
GlobalHost.Configuration.MaxIncomingWebSocketMessageSize = null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的数据量约为200kb,10条消息一致发送.如果每秒发送更多数据,我不知道它的工作情况如何.
正如您已经收集的那样 - 这个数据对于SIGNALR来说太过于自己的设计了.
如果用另一个正常的REST API(GET/POST)来完成另一个进程是不是更好的主意.也许是向用户表明需要这样做的消息,因为这感觉非常像'BATCH'.
其次,如果它是一个要求(可能是工作的错误工具),你考虑过压缩.
小智 5
很容易做到..
使用类似(计算totalBytes
和您拥有的块数据)的调用将块发送到客户端:
hubProxy.Invoke("Send", chunk,currentBytes,totalBytes);
Run Code Online (Sandbox Code Playgroud)totalbytes
和currentBytes
数据,现在你知道接收的所有数据,保存此字节数组到一个文件,流或任何你喜欢.. 归档时间: |
|
查看次数: |
12920 次 |
最近记录: |