Comment envoyer des données big data via SignalR dans .NET client
Nous avons une .NET client, qui utilisent SignalR de du Serveur d'appel de méthode, mais le paramètre semble très grand, pour qu'un tel scénario comment résoudre ce problème?
Code Client:
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);
...
}
Code serveur:
[HubName("ValueHub")]
public class ValueHub : Hub
{
public void Send(string json)
{
}
}
À partir de la pile d'exception et le code source, j'ai trouvé le SignalR utiliser à l'interne HttpClient
avec le FormUrlEncodedContent
type HttpContent
, et peut-être que la limitation est venu à partir d'ici.
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)
Toutes les bonnes suggestions sur ce problème?
- Honnêtement, je ne voudrais pas le faire dans un hub. Utiliser le hub de messagerie cadre d'informer le client que de nouvelles données arrivent. Ensuite, le client peut récupérer les données via l'api web / webmethod ou tout autre transport de la technique.
- Cela peut vous aider stackoverflow.com/questions/7043566/...
- Qu'est-ce que le cas d'utilisation?
- stackoverflow.com/questions/13426014/...
Vous devez vous connecter pour publier un commentaire.
Comme vous l'avez déjà réunis - ce des données est trop pour SIGNALR par sa propre conception.
Ne serait-il pas mieux plutôt qu'un autre processus qui fait cela avec une API REST (GET/POST). Peut-être un message indiquant à l'utilisateur qu'il doit se faire, comme cela se sent très " LOT " comme.
Deuxièmement, si c'est une exigence (possible mauvais outil pour le travail), avez-vous pensé à la compression.
Vous pouvez ajouter une ligne qui rend le message de taille infinie dans votre Démarrage.cs par la définition de la MaxIncomingWebSocketMessageSize à null:
Le mien fonctionne avec ~200 ko de données, de 10 messages envoyer de manière cohérente.
Je ne sais pas comment il fonctionne si il n'y a plus d'envoi de données par seconde si.
il est facile de le faire..
envoyer des morceaux de client avec une invoquer comme (calculer
totalBytes
et le bloc de données que vous avez) :totalbytes
etcurrentBytes
de données, vous connaissez maintenant toutes les données reçues, enregistrer ce tableau d'octets dans un fichier avec le ruisseau ou ce que vous voulez..ajouter cette configuration web
<httpRuntime maxRequestLength="1048576" executionTimeout="600" />
puis ajoutez ce code au Démarrage.cs