Ik heb een Windows Forms applicatie waarin ik een WCF service host, waarbij ik momenteel poort 8080 gebruik om die service op te hosten.
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:
De 'SendUrl' method wordt dan aangeroepen welke verder alles in de client afhandelt:
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
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