Abbiamo un client .NET, che usa SignalR per chiamare il metodo Server, ma il parametro sembra molto grande, per tale scenario come risolverlo?Come inviare grandi dati tramite SignalR in client .NET
Codice cliente: Codice
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);
...
}
Server:
[HubName("ValueHub")]
public class ValueHub : Hub
{
public void Send(string json)
{
}
}
dallo stack eccezione e il codice sorgente, ho trovato il SignalR utilizzare internamente HttpClient
con il FormUrlEncodedContent
tipo HttpContent
, e forse la limitazione è venuto da qui.
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)
Qualche suggerimento su questo problema?
Onestamente non lo farei in un hub. Utilizzare l'hub come framework di messaggistica per informare il cliente che sono arrivati nuovi dati. Il cliente può quindi recuperare i dati tramite web api/webmethod o qualsiasi altra tecnica di trasporto. – Schadensbegrenzer
Questo potrebbe aiutarti http://stackoverflow.com/questions/7043566/invalid-uri-the-uri-string-is-toollong –
Qual è il caso d'uso? – Anders