Mamy klienta .NET, który używa SignalR do wywołania metody Server, ale parametr wydaje się bardzo duży, na taki scenariusz, jak to naprawić?Jak wysłać duże dane za pośrednictwem SignalR w klientach .NET
kod klienta: Kod
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);
...
}
Serwer:
[HubName("ValueHub")]
public class ValueHub : Hub
{
public void Send(string json)
{
}
}
ze stosu wyjątku i kodu źródłowego, znalazłem SignalR wewnętrznie używać HttpClient
z FormUrlEncodedContent
typu HttpContent
, a może ograniczenie przyszedł stąd.
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)
Jakieś dobre sugestie dotyczące tego problemu?
Szczerze mówiąc, nie zrobiłbym tego w hubie. Użyj koncentratora jako struktury przesyłania komunikatów, aby poinformować klienta o pojawieniu się nowych danych. Klient może następnie pobrać dane za pomocą api/webmethod lub innej techniki transportu. – Schadensbegrenzer
To może Ci pomóc http://stackoverflow.com/questions/7043566/invalid-uri-ti--i-mising-is-too-long –
Co to jest przypadek użycia? – Anders