9 messaggi dal 16 luglio 2020
Buongiorno,
mi serve mantenere un oggetto in Asp.net MVC .net 5.0 che usa delle librerie che permettono la connessione a un servizio tramite websocket, prima di tutto mi connetto e appena cerco di usare un metodo che mi restituisce un comando nel server non mi vede la connessione, come risolvo?

Il codice che uso è quello nello screen (nel link), come vedete se tolgo il commento alla connessione nel secondo metodo funziona e se la uso solo nel primo metodo di connessione non la mantiene

https://ibb.co/kqd8KxR

ovvero io non vorrei che ogni volta che cambio pagina dell'app o faccio mando devo mandare un comando mi tocchi aprire la connessione

(sono al mio secondo progetto in Asp.net e mi scuso se non conosco bene tutto)
Modificato da RSSFRA97 il 17 maggio 2021 10:23 -
Ciao!
Se ho capito bene la domanda, quello che ti serve è creare un servizio per la connessione con il websocket ( su asp .net CORE )
Dovresti creare una classe che riguarda il tuo oggetto OBS

 public class ObsWebService : IObsWebService
    {
        protected OBSWebsocket _obs = new OBSWebsocket();
        OBSService con = new OBSService();

        public ObsWebService()
        {
            con.SetOBS(_obs);
            con.ConnectOBS("ws://127.0.0.1:4444", "password");
        }

        public void DoStuff()
        {
            //mio metodo con le operazioni che devo richiamare nei controller
        }
    }


creare un interfaccia di questa classe che implementa le operazioni che ti servono:

   public interface IObsWebService
    {
        void DoStuff();
    }


(DoStuff è un esempio), registrare questa classe come servizio all'interno del contenitore di servizi della applicazione asp.net mvc all'interno del file Startup.cs

       services.AddScoped<IObsWebService, ObsWebService>();


se lo registri come SCOPED -> il tuo oggetto verrà "mantenuto" per ogni sessione dell'applicazione (quando apri una nuova finestra di un browser, viene creato la prima volta che lo usi, per le altre usa lo stesso. Se apri una nuova finestra lo creerà di nuovo.)

se lo registri come SINGLETON -> il tuo oggetto verrà creato un UNICA volta e mantenuto uguale per TUTTI i client.

A quel punto per utilizzarlo devi richiamarlo nel costruttore del controller dove ti serve:

 public class HomeController : ControllerBase
    {
        private readonly IObsWebService obsWebService;

        public HomeController(IObsWebService obsWebService)
        {
            this.obsWebService = obsWebService;
        }
        public IActionResult Index()
        {

            obsWebService.DoStuff();
            return View();
        }
    }


Non sono sicuro sia esattamente quello che ti serva.. mi è sembrato così dalla tua domanda..
fammi sapere!

Maurizio
9 messaggi dal 16 luglio 2020
grazie domani mattina provo.
Aggiungo che mi serve premere un pulsante e attivare la connessione
in quel caso puoi aggiungere al servizio un metodo per attivare la connessione

 public class ObsWebService : IObsWebService
    {
        protected OBSWebsocket _obs = new OBSWebsocket();
        OBSService con = new OBSService();

        public bool IsConnectionEnabled { get; set; } = false;

        public ObsWebService()
        {
            con.SetOBS(_obs);         
        
        }

        public void EnableConnection()
        {
            if (!IsConnectionEnabled)
            {
                con.ConnectOBS("ws://127.0.0.1:4444", "password");
                IsConnectionEnabled = true;
            }
            
        }

        public void DoStuff()
        {
            //mio metodo con le operazioni che devo richiamare nei controller
        }
    }


e aggiungerlo all'interfaccia:

   public interface IObsWebService
    {
        void DoStuff();
        void EnableConnection();
    }


così da poter abilitare la connessione tramite un pulsante dove ti serve. con lo stesso concetto puoi anche chiudere la ocnnessione o eseguire altre operazioni.
Ciao!
9 messaggi dal 16 luglio 2020
grazie, ho fatto dei test ma non funziona, come se l'oggetto si svuota e non mantiene e gli altri metodi che devono richiamare la connessione non trovano la connessione aperta e così da costringermi ogni volta ad aprire la connessione.

questa è la libreria che sto usando: https://github.com/BarRaider/obs-websocket-dotnet

e dovrebbe replicare questo: https://github.com/Palakis/obs-websocket/blob/4.x-current/docs/generated/protocol.md


è una libreria per il comando remoto di OBS Studio
Come l'hai registrato all'interno di startup?
Mi fai vedere l'implementazione del servizio?
9 messaggi dal 16 luglio 2020
ho registrato in startup così:

public void ConfigureServices(IServiceCollection services)
 {
        services.AddMvc()
                      #if DEBUG
                    .AddRazorRuntimeCompilation()
                    #endif
                    ;
       services.AddTransient<IOBSService, OBSService>();
 }



e il service è questo: https://pastebin.com/XYKWNe60
Modificato da RSSFRA97 il 19 maggio 2021 13:35 -
Hai registrato il servizio come TRANSIENT. questo significa che viene ricreato da zero ogni volta che viene chiamato.
per questo ogni volta perde l ostato. prova a registrarlo come SCOPED , dovrebbe mantenere lo stato per ogni sessione (pagina del browser) che viene aperte.
fammi sapere

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.