Mam skonfigurować aplikację konsoli, która po prostu uruchamia pętlę i emituje komunikat za pomocą Signal R. Klient, który nasłuchuje, jest aplikacją kątową.Błąd SignalR podczas żądania Negotation podczas testowania Vagrant VM
Po uruchomieniu lokalnie, (zarówno aplikacja konsoli, jak i strona kątowa) działa dobrze. Jednak gdy uruchamiam moją aplikację konsoli w moim Vagrant VM (Host Ubuntu), a następnie pojawia się nazbyt znajomy komunikat o błędzie, takie jak:
GET http://localhost:12345/signalr/negotiate?clientProtocol=1.5&userId=12345&connectionData=%5B%7B%22
name%22%3A%22testem
itter%22%7D%5D&_=1446565284280 500 (Internal Server Error)
mam wpadł problemów podobnych do tego wcześniej (może to dokładna jeden) więc tutaj są pewne wstępne dane
Kod mam wygląda następująco:
namespace test
{
public class Program
{
public static void Main(string[] args)
{
try
{
using (WebApp.Start<EmmitStartup>("http://*:12345"))
{
Console.Out.WriteLine("Emmit started on http://*:12345");
IEmitterFactory factory = new EmitterFactory();
while (true)
{
Thread.Sleep(5000);
ITestEmitter emitter = factory.Create((ctx) =>
{
return new TestEmitter(ctx);
});
emitter.SayHello();
emitter.Echo("Hello World:" + DateTime.Now);
}
}
}
catch (Exception e)
{
Console.Out.WriteLine(e.Message);
Console.Out.WriteLine(e.StackTrace);
Console.ReadLine();
}
}
}
public class TestEmitter:Emitter,ITestEmitter
{
public TestEmitter(IEmitterContext emitterContext) : base(emitterContext)
{
}
public TestEmitter(IEmitterContext emitterContext, EmitterModel model) : base(emitterContext, model)
{
}
public TestEmitter(IDictionary<string, object> model) : base(model)
{
}
public void SayHello()
{
EmitterContext.Clients.All.onSayHello();
}
public void Echo(string message)
{
EmitterContext.Clients.All.onEcho(message);
}
}
public interface ITestEmitter
{
void SayHello();
void Echo(string message);
}
public class EmmitStartup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
GlobalHost.HubPipeline.AddModule(new ErrorHandlingPipelineModule());
var config = new HubConfiguration()
{
EnableDetailedErrors = true,
EnableJavaScriptProxies = true,
EnableJSONP = true
};
map.RunSignalR(config);
});
}
}
}
- Nie ma żadnych wyjątków lub dzienniki błędów wyrzucane na serwerze.
- mam włączone CORS w SignalR
- Próbowałem używać zarówno
http://*:12345
ihttp://localhost:12345
ihttp://0.0.0.0:12345
- Biblioteka
Emmit
jest po prostu cukier syntaktyczny i sprawia, że bezpośredni przechodzi doSignalR
(próbowałem dokładnie taki sam z SignalR bezpośrednio. - próbowałem różnych kombinacji włączanie/wyłączanie
EnableJSONP
- wiem SignalR działa i dostępny przez VM bo mogę trafić
http://localhost:12345/signalr/hubs
i pokazuje plik proxy. - mam ustawienia portu fowarding do Vagrant VM do portu
12345
- mam wyłączoną zaporę na VM hosta (Ubuntu) z
sudo ufw disable
Kod dla klienta wygląda następująco:
var emmitProxy = null;
Emmit.createProxy({
emitter:'testEmitter',
path:'http://localhost:12345/signalr',
listeners:{
'onSayHello':function(){
$log.info('onSayHello triggered')
},
'onEcho':function(message){
$log.info(message);
}
},
onError:function(){
//an error occured
$log.error('testEmitter:onError');
},
onDisconnected:function(){
//proxy was disconnected
$log.debug('testEmitter:onDisconnected');
},
queryParams:{
userId:'12345' //optional
}
}).then(function(newProxy){
emmitProxy = newProxy;
});
AKTUALIZACJA
Włączyłem logowanie, a tutaj jest wynik. Zanim inna osoba poleci, że włączę CORS, nie sądzę, że CORS jest problemem, myślę, że to tylko kaskadowy wpływ czegoś innego, który ma problem.
UPDATE
I ran tym, w różnych środowiskach, o następujących właściwościach:
- Ran pojemnika dokowanym na Vagrant VM (Ubuntu) - błąd występuje
- Działa bezpośrednio na Vagrant VM (Ubuntu) - ERROR OCCURS
- Deploye d w Docker kontenera do Tutum - błąd występuje
- Ran bezpośrednio przez Visual Studio w systemie Windows - wszystko działa
- Ran bezpośrednio na Mac OSX (na Mono oczywiście) - wszystko działa
Dodałem następujące IHubPipelineModule
public class ErrorHandlingPipelineModule:HubPipelineModule
{
public override Func<HubDescriptor, IRequest, bool> BuildAuthorizeConnect (Func<HubDescriptor, IRequest, bool> authorizeConnect)
{
try
{
Console.Out.WriteLine ("BuildAuthorizeConnect");
return base.BuildAuthorizeConnect (authorizeConnect);
}
catch (Exception exception)
{
Console.Out.WriteLine ("AuthorizeConnect Failure");
Console.Out.WriteLine(exception.Message);
}
return base.BuildAuthorizeConnect(authorizeConnect);
}
protected override void OnAfterDisconnect (IHub hub, bool stopCalled)
{
try
{
Console.Out.WriteLine ("OnAfterDisconnect");
base.OnAfterDisconnect (hub, stopCalled);
Console.Out.WriteLine ("After OnAfterDisconnect");
}
catch (Exception exception)
{
Console.Out.WriteLine ("AfterDisconnect Failure");
Console.Out.WriteLine(exception.Message);
}
}
protected override bool OnBeforeDisconnect (IHub hub, bool stopCalled)
{
try
{
Console.Out.WriteLine ("OnBeforeDisconnect");
return base.OnBeforeDisconnect (hub, stopCalled);
}
catch (Exception exception)
{
Console.Out.WriteLine ("BeforeDisconnect Failure");
Console.Out.WriteLine(exception.Message);
}
return base.OnBeforeDisconnect (hub, stopCalled);
}
public override Func<IHub, System.Threading.Tasks.Task> BuildConnect(Func<IHub, System.Threading.Tasks.Task> connect)
{
try
{
Console.Out.WriteLine("BuildConnect");
return base.BuildConnect(connect);
}
catch (Exception exception)
{
Console.Out.WriteLine(exception.Message);
}
return base.BuildConnect(connect);
}
protected override void OnAfterConnect(IHub hub)
{
try
{
Console.Out.WriteLine("OnAfterConnect");
base.OnAfterConnect(hub);
}
catch (Exception exception)
{
Console.Out.WriteLine ("OnAfterConnect Failure");
Console.Out.WriteLine(exception.Message);
}
}
protected override bool OnBeforeConnect(IHub hub)
{
try
{
Console.Out.WriteLine("OnBeforeConnect");
return base.OnBeforeConnect(hub);
}
catch (Exception exception)
{
Console.Out.WriteLine ("OnBeforeConnect Failure");
Console.Out.WriteLine(exception.Message);
}
return base.OnBeforeConnect (hub);
}
}
I kiedy sprawdzasz logi, tylko kłody, które są drukowane są następujące:
BuildConnect
BuildAuthorizeConnect
UPDATE Nie jestem pewien, czy to będzie istotne i jak może mi brakowało, ale sprawdziłem odpowiedź od 500 i napisali je Here
Wygląda na to, że pokazuje to powiązane z Improperly protected user's key pairs in '/root/.config/.mono/keypairs'.
Ponadto, nie jestem pewien, czy ten link zawiera poufne informacje. Jeśli ktoś może dać mi znać, jeśli to zrobi, byłbym wdzięczny.
Zrobiłem minimalną ilość badań do tej pory i natknąłem SignalR.Owin works under Windows but returns 500 for Mono on Linux
Kiedy sprawdzić zakładkę Network na żądanie negocjacji, mam następujące
nagłówków ** ** Remote Address: 127,0 .0.1: 12345 Zapytanie URL: http://localhost:12345/signalr/negotiate?clientProtocol=1.5&userId=12345&connectionData=%5B%7B%22name%22%3A%22testemitter%22%7D%5D&_=1446964166640 Zapytanie Metoda: Pobierz kod status: 500 Internal Server Error
HTTP/1.1 500 Internal Server Error
Access-Control-Allow-Origin: http://localhost:8100
Access-Control-Allow-Credentials: true
X-Content-Type-Options: nosniff
Content-Type: text/html
Server: Mono-HTTPAPI/1.0
Date: Sun, 08 Nov 2015 06:30:28 GMT
Connection: close
Transfer-Encoding: chunked
Accept:text/plain, */*; q=0.01
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:JSESSIONID.ae4b31f4=aqpz31hevinaauwftyijure; JSESSIONID.26c95422=1m32u58exuvjz5jrojszqziqh; JSESSIONID.3fd19426=iv9fawaej3nt14yzcruj45si5; JSESSIONID.8868ba42=1gh4w06alx8ehuuj1adr5w8y8; JSESSIONID.947cfb91=nyxfrp6u0pny1sl8gwlouprh4; screenResolution=1280x800
Host:localhost:12345
Origin:http://localhost:8100
Pragma:no-cache
Referer:http://localhost:8100/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36
Gdyby to był CORS, czy w ogóle by nie zadziałało?Jak już wspomniałem, działa lokalnie idealnie dobrze i pochodzi z różnych portów. – TheJediCowboy
Czy zweryfikowałeś nagłówki HTTP? –
Naprawdę właśnie go teraz wyciągam. Byłem zapakowany w inne rzeczy. – TheJediCowboy