web-services - esempio - websocket server javascript




Eccezione di socket nell'app Metro-style quando la condivisione รจ attivata per una rete (2)

Sto lavorando a un'app in stile Metro che comunica con il nostro server tramite un servizio web. All'inizio, ho scoperto che avevo bisogno di aggiungere le funzionalità "Home or Work Networking" (privateNetworkClientServer) e "Internet Client" (internetClient) nel manifest, altrimenti l'app avrebbe colpito delle eccezioni quando si tentava di effettuare chiamate di servizi Web a un remoto ospite.

Ora, tuttavia, su alcune macchine viene visualizzata la seguente eccezione di socket quando l'app tenta di chiamare il nostro servizio Web:

System.ServiceModel.EndpointNotFoundException: There was no endpoint listening at https://[my_service_url] that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. ---> System.Net.WebException: Unable to connect to the remote server
---> 
System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions [my_server_ip_address]:443
   at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
   at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
   --- End of inner exception stack trace ---
   at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context)
   at System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStreamAsyncResult.CompleteGetRequestStream(IAsyncResult result)
   --- End of inner exception stack trace ---
   at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannelProxy.TaskCreator.<>c__DisplayClass5`1.<CreateGenericTask>b__4(IAsyncResult asyncResult)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()

È interessante notare che se disabilito la condivisione (fai clic con il pulsante destro del mouse sulla connessione Wi-Fi, seleziona "Attiva o disattiva condivisione" e scegli "No, non attivare la condivisione o la connessione ai dispositivi"), il problema scompare e le chiamate al servizio web avere successo. Se poi torni indietro e riattivi la condivisione (seleziona "sì" invece di "no"), il problema ritorna.

Sembra quindi che il problema sia legato al fatto che la rete abbia la condivisione e i dispositivi abilitati. Non sono completamente sicuro della mappatura, ma penso che in pratica si riducano alla distinzione tra reti "casa / lavoro" e reti "pubbliche"; nel mio caso le chiamate al servizio web falliscono quando la rete è "casa / lavoro" e riescono quando la rete è "pubblica" - ma la mia app ha dichiarato entrambi i tipi di funzionalità di rete e questo problema non si verifica su tutte le caselle. Non sono inoltre presenti firewall o altre restrizioni di rete; è un'installazione di Win8 senza ossa, senza ulteriori modifiche.

Infine, questo non è isolato dai servizi web: la stessa app ha iframe che non riescono o che riescono esattamente sotto alcune condizioni come i servizi web.


Ho avuto lo stesso problema. Ho risolto il problema impostando le giuste funzionalità nel file Package.appxmanifest. Qui è necessario controllare Internet (Client) e reti private (client e server).

Questo funziona per me su VS 2012 e Windows RT.


Verifica se la rete privata è configurata come capacità ... Se la connessione di rete è configurata come Work / Home, questa funzionalità sarà richiesta