я использую signalR на моей стороне сервера
и signalR в качестве клиентской (java) стороны Android
когда я звоню SyncFromServer всеработает хорошо, за исключением каждого ответа, отправляемого с сервера, ответ занимает 2 минуты (с веб-сервисом всего 0,5 с), всегда 2 минуты для всех данных или даже только для одного объекта.
контакт - это классс тем же полем с сервера, и все полученные данные верны.
это мой класс Android для вызова функции:
public class SignalRService extends Service {
private HubConnection mHubConnection;
private HubProxy mHubProxy;
private Handler mHandler; // to display Toast message
private final IBinder mBinder = new LocalBinder(); // Binder given to clients
public SignalRService() {
}
@Override
public void onCreate() {
super.onCreate();
mHandler = new Handler(Looper.getMainLooper());
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int result = super.onStartCommand(intent, flags, startId);
startSignalR();
return result;
}
@Override
public void onDestroy() {
mHubConnection.stop();
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// Return the communication channel to the service.
startSignalR();
return mBinder;
}
/**
* Class used for the client Binder. Because we know this service always
* runs in the same process as its clients, we don't need to deal with IPC.
*/
public class LocalBinder extends Binder {
public SignalRService getService() {
// Return this instance of SignalRService so clients can call public methods
return SignalRService.this;
}
}
/**
* method for clients (activities)
*/
public SignalRFuture<contact[]> SyncFromServer(int i) {
Log.e("call","SyncFromServer");
String SERVER_METHOD_GETAGENTS = "SyncFromServer";
SignalRFuture<contact[]> ls = mHubProxy.invoke(contact[].class,SERVER_METHOD_GETAGENTS,i);
Log.e("call","end SyncFromServer");
return ls;
}
private void startSignalR() {
Platform.loadPlatformComponent(new AndroidPlatformComponent());
Credentials credentials = new Credentials() {
@Override
public void prepareRequest(Request request) {
request.addHeader("User-Name", "BNK");
}
};
String serverUrl = "http://xx.xx.xx.xx/signalr";
mHubConnection = new HubConnection(serverUrl);
mHubConnection.setCredentials(credentials);
String SERVER_HUB = "AgentsHub";
mHubProxy = mHubConnection.createHubProxy(SERVER_HUB);
ClientTransport clientTransport = new ServerSentEventsTransport(mHubConnection.getLogger());
SignalRFuture<Void> signalRFuture = mHubConnection.start(clientTransport);
try {
signalRFuture.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
return;
}
mHubConnection.error(new ErrorCallback() {
@Override
public void onError(Throwable error) {
Log.e("SignalR","Error"+error.getMessage());
error.printStackTrace(); //<==SocketException
}
});
}
}
концентратор сервера:
public class AgentsHub : Hub
{
agentsEntities1 db = new agentsEntities1();
public contact SyncFromServer(int i) {
var list =db.contact.ToList();
return list[i];
}
}
и класс запуска:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration { };
hubConfiguration.EnableDetailedErrors = true;
map.RunSignalR(hubConfiguration);
});
}
}