zelfgastheer wcf voegt servicereferentie toe

Dus ik heb een winforms-client gemaakt en een wcf-klassenbibliotheek aan de oplossing toegevoegd.

In winforms doe ik het

ServiceHost svc = new ServiceHost (typeof (...), nieuwe Uri ("net.pipe://localhost/MyNamedPipe")

en dan svc.Open() die boete uitvoert.

Nu, hoe voeg ik een servicereferentie toe, dus in dezelfde winforms kan ik een proxy krijgen voor die wcf?

Ik kon dit alleen genereren door ASP.NET Development Server te gebruiken die startte toen winforms werden uitgevoerd en dus heb ik die URL gekopieerd, gestopt met foutopsporing (Development Server was nog steeds actief) en voegde daar vervolgens een serviceverwijzing aan toe. Maar dat is niet correct denk ik.

Natuurlijk kan ik direct naar wcf contractklasse verwijzen en het gebruiken, maar dat is ook niet gepast.

3

2 antwoord

Wanneer je beide uiteinden op die manier beheert, gebruik ik het beste ChannelFactory :

NetNamedPipeBinding binding = new NetNamedPipeBinding();
EndpointAddress address = new EndpointAddress("net.pipe://localhost/MyNamedPipe");
ChannelFactory factory = new ChannelFactory(binding, address);
YourInterface yourInterface = factory.CreateChannel();
4
toegevoegd
Omdat u door een verwijzing naar uw eigen service toe te voegen, u gewoon te maken krijgt met dynamisch gegenereerde dubbele code. U hebt dynamisch gegenereerde dingen nodig als u geen gemakkelijke toegang hebt tot de echte interfacedefinitie. Je hebt er gemakkelijk toegang toe dus gebruik het.
toegevoegd de auteur Russell McClure, de bron
U probeert de hoofd UI-thread van uw WinForms-app te gebruiken om naar uzelf te bellen. U krijgt een time-out omdat de thread wacht op zichzelf om terug te gaan naar de berichtenpomp voor de oproep. Dat zal nooit gebeuren, vandaar de time-out. U moet uw ontwerp heroverwegen. Het is niet echt logisch om te proberen uw eigen WCF-serviceformulier te bellen binnen uw servicehost.
toegevoegd de auteur Russell McClure, de bron
Waarom heeft dit de voorkeur?
toegevoegd de auteur Nickolodeon, de bron
Ik schreef svc = new ServiceHost (typeof (TokenizationService1.TokenizationService) & zwnj;, nieuwe Uri ("net.pipe://localhost/MyNamedPipe")); svc.Open (); ChannelFactory f = new ChannelFactory (new NetNamedPipeBinding (), nieuw EndpointAddress ("net.pipe://localhost/MyNamedPipe")); service = f.CreateChannel ();
toegevoegd de auteur Nickolodeon, de bron
Maar bij het aanroepen van service.Tokenize (waarde) later krijg ik een time-out uitzondering en blijkbaar ziet de klant het niet. Man, dit is moeilijk (
toegevoegd de auteur Nickolodeon, de bron
Nee, Russel. Dat was niet het probleem. ServiceMetadata toegevoegd aan gedrag loste het op. zoals in stackoverflow.com/questions/2579288/…
toegevoegd de auteur Nickolodeon, de bron
Maar draaien op dezelfde thread is ook een probleem, dus ik denk dat je gelijk hebt.
toegevoegd de auteur Nickolodeon, de bron

Heb je geprobeerd een servicereferentie aan het project toe te voegen en vervolgens je URI rechtstreeks in het vak Adres van het dialoogvenster in te voeren?

Merk op dat dit de volledige URI zou moeten zijn, zoals net.pipe://localhost/MyNamedPipe.

U vindt stap-voor-stap instructies van MSDN hier .

1
toegevoegd
@ Nickolodeon: Klik niet op Discover, voer gewoon uw volledige URI in: net.pipe://localhost/MyNamedPipe.
toegevoegd de auteur competent_tech, de bron
@Nickolodeon: bijgewerkt antwoord met extra info.
toegevoegd de auteur competent_tech, de bron
Ik wist niet dat iemand dat kan doen. Maar toen ik op Discover klikte, kreeg ik een oplossing aangeboden en werd ik een aantal localhost: 3049 gecertificeerd, hoewel ik netPipeBinding in dienst heb gesteld config.
toegevoegd de auteur Nickolodeon, de bron
Ik heb dat adres ook geprobeerd. Maar waarom zou de serviceverwijzing het vinden - pijp wordt op dat moment niet gemaakt, denk ik. Service moet worden gehost en gestart, dus het maakt de pijp. Maar om het te hosten, moet ik eerst proxy-klassen genereren. Het is net als catch 22 (((. Laat me je link even controleren.
toegevoegd de auteur Nickolodeon, de bron