WCF self-hosted: het kiezen van een poort

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 27-09 13:36
Ik heb een Windows Forms applicatie waarin ik een WCF service host, waarbij ik momenteel poort 8080 gebruik om die service op te hosten.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        private readonly Uri _address = new Uri("http://localhost:8080/myservice");
        private ServiceHost _serviceHost;

        private void SetupService()
        {
            this.StopService();

            _serviceHost = new ServiceHost(typeof(Service.Service), _address);

            // Enable metadata publishing.
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
            _serviceHost.Description.Behaviors.Add(smb);

            var ep = _serviceHost.AddServiceEndpoint(typeof(IService), new CorsBinding(), "");
            ep.Behaviors.Add(new WebHttpBehavior());
            ep.Behaviors.Add(new EnableCorsEndpointBehavior());

            _serviceHost.Open();
        }


Naast de applicatie heb ik ook een userscript geschreven voor Chrome/Firefox (Tampermonkey / Greasemonkey). Deze userscript is bedoeld voor een specifieke website. Links die voldoen aan een bepaald criteria worden rood gemaakt, en de bedoeling is dat de gebruiker met een klik op deze link informatie naar de Windows Forms applicatie stuurt. De applicatie handelt die informatie daarna verder af.

De communicatie verloopt via de WCF service. In het userscript hang ik een 'click' event aan de rode links welke via een ajax request de WCF service op localhost aanspreekt:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
        $.ajax({
            url: 'http://localhost:8080/myservice/SendUrl',
            method: 'POST',
            data: {url: "de url van de rode link"},
            dataType: 'jsonp',
            timeout: 3000,
            success: function(result) {
            },
            error: function(xhr, s, error) {
                alert('Error in communication. Is the client running?');
            }
        });


De 'SendUrl' method wordt dan aangeroepen welke verder alles in de client afhandelt:
C#:
1
2
3
4
5
6
7
    public class Service : IService
    {
        public void SendUrl(string url)
        {
            MainForm.Instance?.ReceiveUrl(url);
        }
    }



Dit lijkt prima te werken, behalve als de poort 8080 al in gebruik is...

Hoe kan ik dit oplossen? Ik heb niet zoveel kaas gegeten van dit soort dingen maar ik loop hier tegen een probleem aan waar ik volgens mij niet omheen kom...

Ik zou de poort natuurlijk een setting kunnen maken die de gebruiker kan instellen, of gewoon poorten blijven proberen tot er eentje werkt (dat kan vast handiger), maar dan heb ik nog steeds een probleem: het userscript weet dan niet welke poort hij moet aanroepen. Het userscript host ik in principe zelf en is eigenlijk voor elke gebruiker hetzelfde. Het is dus niet zo makkelijk om de poort variabel te maken want dan moet ik elke gebruiker een apart userscript gaan geven met de poort die ze gekozen hebben. Of op een of andere manier de poort in het script variabel houden en het door de gebruiker laten aanpassen. Dat zie ik niet zitten, mijn gebruikers weten vast niet wat een poort uberhaupt is.

Ik zou natuurlijk ook een poort kunnen pakken die misschien wat minder kans heeft om al in gebruik te zijn, maar dan nog hou ik de kans dat iemand die poort al gebruikt.

Het lijkt me dat dit probleem toch veel vaker voor moet komen? Volgens mij doe ik iets fundamenteel fout :p

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:32

mulder

ik spuug op het trottoir

Normaliter zorg je er voor dat je de uri inderdaad configurabel is, bijvoorbeeld in de App.config. Je zult dat port number dan idd ook in het script moeten instellen.

Maar je situatie is sowieso een beetje vreemde, vanuit een browser via localhost een WCF service aanroepen die in een WinForm draait, wat probeer je te bereiken?

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 27-09 13:36
Ik zal het proberen kort uit te leggen...


Ik ben lid van een (prive) forum van een bepaald spel. In dat forum worden vaak bestanden gedeelt als attachment. De forum posts met deze bestanden zijn dus over het hele forum verspreid, maar een aantal mensen hebben de moeite genomen om een post te maken met de links naar alle posts met deze attachments. Een soort van overzicht post dus waar je terecht kan om de attachments te vinden.

Om het makkelijker te maken om dit overzicht up to date te houden heb ik deze applicatie geschreven. Eigenlijk is het een soort handmatige scraper. Het is niet echt mogelijk om een automatische scraper te maken voor verschillende redenen.

De forum leden die de overzicht post bij houden draaien mijn userscript. Dit userscript checkt elke post voor de attachments die ze zoeken. Als een post zo'n attachment heeft dan wordt de post rood gekleurd zodat hij opvalt. Daarnaast wordt er een click event aan de post gehangen. Als er op de post geklikt wordt dan wordt de URL naar die post doorgestuurd naar de client winforms applicatie die men op de achtergrond heeft draaien. Deze handelt de rest verder af: parsen van de post, kijken of de attachment klopt, details van de post ophalen (naam van forum member, datum, etc), en dit alles wordt opgeslagen in een database.

Met behulp van die database wordt periodiek de overzicht post gewijzigd.


Het userscript dient dus enkel voor:
1. Checken of een post een attachment heeft (en of dat het goeie attachment type is).
2. De url doorsturen naar de client applicatie.

De client applicatie doet verder het 'zware werk'. Dat werk is niet in de userscript zelf af te handelen omdat er veel meer bij komt kijken.


Dit forum is verder niet toegankelijk voor plugins oid, het is een totaal oud platform (JForum denk ik, vreselijk), vandaar deze omweg... Maar het werkt in principe prima, op het poort probleem na dus.

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:32

mulder

ik spuug op het trottoir

Gewoon een ander poort nummer gebruiken dus

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

Poort 8080 wordt vaak geclaimed als alternatief voor poort 80 door een webserver, zoals hierboven gemeld voor je WCF gewoon een andere poort kiezen.

Death smiles at us all, all a man can do is smile back.
PSN