[VB.NET] Webservice + Observer patroon

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
We hebben tijdens mijn studie JAVA gehad met het observer patroon, daarbij kun je dus simpel een client data toezenden wanneer die aangemeld was op de server applicatie.

Nu wil ik graag binnen VB.NET hetzelfde doen echter bij toepassing van de webservice.
Een client die zich via een webservice aanmeld op een service wordt op de hoogte gebracht van eventuele wijzigingen.

Nu heb ik geprobeerd met Handler events, wanneer je dus een property aanpast dat de client hierop zou reageren, dit werkt alleen indien je lokaal wat aanpast en niet als je dat doet op de server (ByRef).

Ik heb geprobeerd te werken met Callback functie, dit lukte al beter had iig wat vertraging maar nog niet wat ik zoek, want ik kan zelf niet bepalen wanneer ik de client een specifieke functie laat uitvoeren.

Ik heb gekeken naar het uitvoeren van een functie ByRef maar dat werkt niet met VB.NET en WebServices i.v.m. dat je alleen property objecten kunt gebruiken.

Heeft iemand een idee of dit uberhoud mogelijk is, voordelen hiervan vind ik dat je het voor iedereen simpel toegankelijk kan maken, dat je makkelijk over SSL kunt werken voor beveiliging en op webservices kun je een wachtwoord plaatsen.

Hartelijk dank voor de reacties alvast.

Jos

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Een webservice is PULL, geen PUSH. Na ja, het kan wel...

[ Voor 29% gewijzigd door RobIII op 28-01-2010 18:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Dat weet ik een webservice reageerd normaal op aanvraag van een client.
Maar is het mogelijk dat de client een callback krijgt wanneer er een wijziging op de server plaatsvind?

Acties:
  • 0 Henk 'm!

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Als je WCF gebruikt dan zou je je eens kunnen verdiepen in Duplex Services:
http://msdn.microsoft.com/en-us/library/ms731064.aspx

Ducati: making mechanics out of riders since 1946


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Die ga ik bekijken bedankt, mocht er iemand nog meer oplossingen hebben hoor ik het graag. Als ik iets werkends gevonden heb post ik het iig.

Acties:
  • 0 Henk 'm!

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Ik weet ook dat er zoiets bestaat als WS Notification en WS Eventing (zie wikipedia).
Maar dat lijkt meer gericht op webservices onderling dan tussen webservice en client.

Misschien kan het een oplossing zijn voor je probleem :)

Ducati: making mechanics out of riders since 1946


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Bedankt voor jullie tips...

Ik heb gekeken naar WS eventing en duplex. Ik heb binnen webservice zelf nu zoiets werkend echter houd je dan dat je server een timeout geeft wanneer je een bepaalde tijd niet reageerd. (Geen notify geeft). Dat heb ik opgelost door de timeout uit te stellen (20 minuten) en na een 15 minuten zoiezo een notify te geven om de lijn levend te houden.

Daarbij ben ik nu gaan kijken naar TCPChannel en HTTPChannel, ik ben hier een heel eind mee gekomen. Ik heb twee commandline programmas gehad welke een notify doorgaf etc. Ik heb nu dit weten te integreren binnen webservice server. Dat werkt ook goed, echter snap ik het verschil niet helemaal tussen TCPChannel en HTTPChannel, want ik kon inderdaad mezelf aanmelden als client op de server over het internet maar wanneer ik een event gaf dan moet persee de poort open staan bij de client (teminste dat denk ik) en je moet opgeven op welk ip adres extern de client werkt.

Fout die ik nu krijg:

System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 192.168.1.8:1601
at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)
at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)
--- End of inner exception stack trace ---

Server stack trace:
at System.Net.HttpWebRequest.GetRequestStream()
at System.Runtime.Remoting.Channels.Http.HttpClientTransportSink.ProcessAndSend(IMessage msg, ITransportHeaders headers, Stream inputStream)
at System.Runtime.Remoting.Channels.Http.HttpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)

Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at Library.IListener.push(String iLabel)
at Library.Observer.informeren(String iLabel) in d:\Applicatie\Library\Observer.vb:line 27
at Service.Inform(String iLabel)


De code die ik nu heb:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
            ' Communicatie kanaal instellen
            Dim poortinfo As IDictionary = New Hashtable()
            poortinfo("port") = 0
            poortinfo("typeFilterLevel") = Runtime.Serialization.Formatters.TypeFilterLevel.Full

            Dim serverProv As New BinaryServerFormatterSinkProvider
            serverProv.TypeFilterLevel = Runtime.Serialization.Formatters.TypeFilterLevel.Full

            Dim clientProv As New BinaryClientFormatterSinkProvider

            Dim httpchannel As New HttpChannel(poortinfo, clientProv, serverProv)

            ChannelServices.RegisterChannel(httpchannel, False)

            ' Object uitlezen
            RemotingConfiguration.RegisterWellKnownClientType(GetType(IObserver), serverAdres)
            server = CType(Activator.GetObject(GetType(IObserver), serverAdres), IObserver)

            ' Status weergeven
            TextBox1.Text += vbCrLf & "Verbonden met server!"

            ' Client aanmaken
            Dim client As IListener = New Listener()
            server.aanmelden(client)

            ' Handler toevoegen
            AddHandler client.inform, AddressOf myUpdate
            TextBox1.Text += vbCrLf & "Als listener verbonden"


Heeft iemand een idee hoe ik dit wel moet doen?
Ik dacht namelijk dat het event dan over dezelfde channel terug zou gaan..
Of dat iig dit zou werken over poort 80 dan ofzo.

Want ik vond als verschil op internet dat HTTP over SSL kan werken, authenticatie gebruikt van IIS, dat TCP dat allemaal niet doet. HTTP is trager, TCP niet want die werkt niet met SOAP. Maar nog vind ik niet het goede.

Bedankt vast.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
...snap ik het verschil niet helemaal tussen TCPChannel en HTTPChannel...
...
HTTP is trager, TCP niet want die werkt niet met SOAP.
Ik denk dat je eens even wat zaken uit elkaar moet gaan halen. TCP is protocol dat zich bevindt in de Transport Layer en HTTP is een protocol dat zich bevindt in de Application Layer. Twee heel verschillende zaken binnen het OSI model voor twee heel verschillende doeleinden.
Josvds schreef op vrijdag 05 februari 2010 @ 19:08:
Ik dacht namelijk dat het event dan over dezelfde channel terug zou gaan..
Of dat iig dit zou werken over poort 80 dan ofzo.
Je hebt inkomend en uitgaand verkeer. Je hebt requests en responses. Je hebt te maken met een firewall/NAT en poorten. Een uitgaand request (op een random poort, naar poort 80) wordt beantwoord door de server vanaf poort 80 naar de poort waar jouw request vandaan komt. Daar hoef je geen poorten voor open te zetten, dat regelt je NAT device (en de NAT table) voor je (hou zou je anders kunnen internetten bijvoorbeeld?).

Een HTTP request is een request dat (doorgaans) over TCP getransporteerd wordt (maar kan feitelijk net zo goed over IPX/SPX for all I know). TCP heeft geen benul van HTTP.

HTTPS is niets anders dan "gewone HTTP" gecombineerd met TLS/SSL

Jouw probleem (en zie mijn eerste reply) zit 'm in het feit dat je "van buitenaf" naar "binnen" probeert te komen. Omdat de verbinding niet van binnenuit geïnitieerd is heeft je NAT device geen benul waar 'ie de data die 'ie aan de publieke kant aangeboden krijgt moet laten en dus kan 'ie er niks mee en zal je PC achter de NAT nooit de data überhaupt te zien krijgen. Dat 'van buiten naar binnen' (dus de Server die de Client probeert aan te spreken) heet PUSH. En dat is lastig te realiseren tenzij je poorten gaat mappen e.d. (en dat wil je niet van je gebruikers gaan verlangen). Wat je wel kunt doen is van binnenuit de server aanspreken (dus Client initieert verbinding en begint te babbelen met de Server). Vanaf dat moment weet je NAT device waar antwoorden naar toe moeten (immers, hij heeft het source/destination IP en de source/destination poort) en kun je vanuit de Server met de Client gaan babbelen. Maar dan zul je wel connecties open moeten gaan houden; en laat nou net de pest zijn dat HTTP normaliter na elke request (tenzij er een keepalive wordt gebruikt) de connectie sluit.

[ Voor 76% gewijzigd door RobIII op 05-02-2010 19:41 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Nou ik had het dus ver werkend:

Netwerk 1 - VMWare : Server start op
Netwerk 1 - PC : Client start op en meld zich aan (via het publieke IP adres op het internet)
Netwerk 1 - VMWARE: Server geeft een event naar alle listeners
Netwerk 1 - PC: Client ontvangt melding

(Waarschijnlijk omdat de client zijn interne IP mee geeft en dat de server hem wel via zijn interne IP kan benaderen, want ze zitten op het zelfde netwerk)

Als ik nu het volgende toevoeg:

Netwerk 2 - PC: Client start op en meld zich aan (via het publieke IP adres op het internet)
Netwerk 1 - VMWare : Server geeft event naar alle listeners
Netwerk 1 - VMWare : Response dat IP niet beschikbaar is (IP Adres van Client 2 intern)

Ofwel ik maak vanaf de client verbinding met de server. Ik had verwacht dat het event dan over dezelfde channel terug zou gaan maar dat doet hij dus schijnbaar niet. Hiervoor wordt een nieuwe channel gebruikt die de client aanmaakt.

Ik had de toepassing via webservice gemaakt en de server dus elke 15 minuten een notify laten geven. Dit werkt maar is volgens mij geen juiste manier. Ik zou eventueel bij de client de poort open kunnen zetten want het is een notify dat de server data moet gaan ophalen.

Maar hoe krijg ik deze lijn beveiligd. Via SSL weet ik wel hoe dat binnen IIS7 kan maar dit werkt dan niet via IIS volgens mij. Ik heb teveel informatie op internet gelezen maar krijg de juiste combinatie nu niet in beeld. Want HTTP is idd een laag die boven TCP loopt maar binnen de applicatie was het +/- alleen veranderen van tcpchannel naar httpchannel en de url waarop de server benaderbaar is geen tcp:\\ maar http:\\.

Ik weet namelijk dat het Observer patroon binnen Java wel naar buiten kan en volgens mij ook over dezelfde kanaal werkt. De server zet dan zijn poort open en de client krijgt over dezelfde channel response. Dit werkte met RMI (geleerd op school) echter krijg ik op school niet goed uitleg hoe dat binnen VB.NET werkt.

Het liefst zet ik geen poorten open bij de client maar als het echt moet dan ga ik daar toch naar kijken en hoe ik dan beveiliging moet toepassen. Ik ga iig even kijken naar de keepalive waar je het over had. Bedankt!

Als iemand hier een goede site voor weet hoe dit werkt dan hoor ik het graag.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Een tcpchannel doet denken aan .Net Remoting, wat achterhaald is, terwijl ik dacht dat je WCF duplex zou gaan gebruiken? Dan lijkt het me dat je een NetTcpBinding (of WSDualHttpBinding) wil. Security is dan simpelweg in te stellen als je SSL wil, en er zijn geen open poorten nodig op de client.

Zoeken op observer WCF geeft ook wel wat hits, bijvoorbeeld dit met heel veel (te veel) leesmateriaal. ;)

Overigens bestaat er voor het oude .net remoting wel iets als het commerciële genuinechannels dat wel aan bi-directionele lijntjes doet, maar zoals ik al zei is .Net Remoting inmiddels achterhaald, dus focus je gewoon op WCF.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Blijf je met wsHttpDualBinding niet met het probleem zitten dat je een standaard timeout hebt?
Ik heb namelijk gewerkt met een AutoResetEvent op de server waarop de client zich aanmeld. Die wordt dan in de wacht gezet. Echter krijg je na een bepaalde tijd een timeout. Deze kun je wel zodanig zetten dat je er geen last meer van hebt maar dat is niet de juiste manier. (KeepAlive is dat volgens mij zoals ik eerder gelezen heb)

Ik ben net bezig geweest met wsHttpDualBinding, heb verschillende sites gevonden maar ze maken overal gebruik van InstanceContext die ze meegeven als ze een service aanmaken op de client.

dim context as new InstanceContext(IClient)
dim service as new ServiceReference(context)

Dit kan ik echter niet bij mij gevonden krijgen, heb al op verschillende sites gekeken. Ik kan alleen EndPoint configuration, remoteAdres, binding.

Ik ga zo verder met zoeken, maar mocht iemand een idee hebben wat ik verkeerd doe dan hoor ik het graag.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
HTTP is (nog) niet echt geschikt voor tweerichtingscommunicatie, en daarbij heb je dus alsnog een open poort op de client nodig (of je hebt veel meer overhead met Silverlight's PollingDuplexHttpBinding). Vandaar dat ik NetTcpBinding aanraadde. En daar is vast wel een voorbeeld van te vinden.

Verder moet je een referentie maken in je project naar System.ServiceModel.dll, of werken met een WCF-project waar die referentie al in zit, anders vindt je die class inderdaad niet. Waarom heb je trouwens voor VB.NET ipv c# gekozen? C# lijkt meer op java namelijk.

Ik snap trouwens niet wat je hier met die AutoResetEvent bedoelt; een tcpbinding blijft gewoon alive, behalve bijvoorbeeld als deze meer dan 15 minuten idle is achter een NAT-router. Dat lijkt me vrij makkelijk op te lossen door even om de 10 minuten een onzinrequest to doen ofzo. :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Bedankt voor je reactie..

Korte toelichting, gewenst is een VB.NET product daarom dat ik niet op C# werk of op Java want anders had ik idd zelf voor Java gekozen omdat ik daar wel bekend mee bend.

Die autoresetevent was als ik nog werkte via webservices en een client die zich daarop aanmelden met een callback die later kwam, dat was niet in combinatie met tcp of httpchannel.

Ik ben wat opties aan het uitzoeken maar heb bij deze twee nog niet zo`n fijn gevoel. Ik vind voor de wsdualhttpbinding veelal C# voorbeelden wat idd problemen opleverd bij omzetten naar VB. Ik ga hier verder onderzoek naar doen en ook naar NetTcpBinding. Mocht iemand nog andere ideen hebben of tips dan hoor ik het altijd graag.

Bedankt nogmaals.

Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Ik wou toen straks berichten dat ik zo blij was dat het werkte, echter blijkt het nu alleen op de pc lokaal te werken. Net op een andere pc in of uit het netwerk. Ik heb op internet gezocht maar snap niets van de configuratie van de endpoints etc.

Ik kan de service benaderen van buitenaf, ik kan deze initialiseren binnen vb.net echter kan ik hem niet gebruiken want na enige tijd krijg ik een timeout (1 minuut die staat ingesteld). Authenticatie fout ook gehad maar weet niet hoe deze op te lossen bij mijn weten heb ik nu toch alle beveiliging uit staan.

Anoniem toegestaan op de IIS7 server.

Client initialiseerd:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<system.serviceModel>
        <bindings>
            <wsDualHttpBinding>
                <binding name="HttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
                    receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
                    transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00" />
                    <security mode="None">
                        <message clientCredentialType="Windows" negotiateServiceCredential="true" />
                    </security>
                </binding>
            </wsDualHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://www.mijndomein.nl/Service.svc" binding="wsDualHttpBinding"
                bindingConfiguration="HttpBinding" contract="Service.IService"
                name="HttpBinding" />
        </client>
    </system.serviceModel>


De code op de server in web.config
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<system.serviceModel>

    <bindings>
      <wsDualHttpBinding>
        <binding name="DualHttpBinding">
          <security mode="None">
            <message clientCredentialType="None" />
          </security>
        </binding>
      </wsDualHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <services>
      <service behaviorConfiguration="ServiceBehavior" name="Service">
        <endpoint address="http://www.mijndomein.nl/Service.svc" binding="wsDualHttpBinding"
          bindingConfiguration="DualHttpBinding" name="HttpBinding" contract="IService" />
        <endpoint address="mex" binding="mexHttpBinding" name="MexBinding"
          contract="IMetadataExchange" />
      </service>
    </services>
    
  </system.serviceModel>


IService
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<ServiceContract(Namespace:="http://www.mijndomein.nl/", SessionMode:=SessionMode.Required, CallbackContract:=GetType(IMessage))> _
Public Interface IService

    <OperationContract(IsOneWay:=False)> _
    Function aanmelden(ByVal naam As String) As Boolean

    <OperationContract(IsOneWay:=True)> _
    Sub inform(ByVal label As String)

End Interface


Public Interface IMessage

    <OperationContract(IsOneWay:=True)> _
    Sub informeer(ByVal label As String)

End Interface


En de service zelf
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Imports System.Collections.Generic

<ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Single, InstanceContextMode:=InstanceContextMode.PerCall)> _
Public Class Service
    Implements IService

    Public Shared clients As New Dictionary(Of String, IMessage)

    Public Function aanmleden(ByVal naam As String) As Boolean Implements IService.aanmelden
        Dim client As IMessage = OperationContext.Current.GetCallbackChannel(Of IMessage)()
        Service.clients.Add(naam, client)
        Return True
    End Function

    Public Sub inform(ByVal label As String) Implements IService.inform
        For Each client In Service.clients.Values
            client.informeer(label)
        Next
    End Sub
End Class


Edit: Het gaat pas fout wanneer ik de aanmeld functie daadwerkelijk uitvoer.
Iemand een idee wat ik fout doen? Bedankt

Acties:
  • 0 Henk 'm!

  • Jay-P
  • Registratie: Oktober 2003
  • Laatst online: 04-06 00:39
Google ff op clientaccesspolicy.xml. Die heb je nu volgens mij nodig omdat je crossdomain calls doet nu.

Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Ik heb zojuist een simpele service opgezet, deze eerst op wshttpbinding. Dit werkte beveiliging uitgeschakeld.

Kort de opbouw:
Thuis PC (Windows 7) bevat VMWare (Windows 2008) met eigen ip adres.
Remote PC hangt ergens anders op het internet om te testen of de service werkt.
Domeinnaam naar thuis IP gekoppeld.

Nu omgezet naar wsdualhttpbinding, op mijn thuis pc werkt het, de service draait op de VMWare machine.
Dit werkte pas toen ik de firewall van mij pc uitschakkelde. Hij benaderd hem wel via het domeinnaam, het duurt iets langer merk ik dus neem aan dat dat goed gaat.

Nu wil ik deze benaderen vanaf mijn Remote PC maar dat lukt me niet.

Error:
System.TimeoutException: De open bewerking is niet voltooid binnen de toegewezen time-out van 00:01:00. Mogelijk is de toegewezen tijd voor deze bewerking een deel van een langere time-out.

Server stack trace:
bij System.ServiceModel.Channels.ReliableRequestor.ThrowTimeoutException()
bij System.ServiceModel.Channels.ReliableRequestor.Request(TimeSpan timeout)
bij System.ServiceModel.Channels.ClientReliableSession.Open(TimeSpan timeout)
bij System.ServiceModel.Channels.ClientReliableDuplexSessionChannel.OnOpen(TimeSpan timeout)
bij System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
bij System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
bij System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
bij System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)
bij System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)
bij System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
bij System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
bij System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]:
bij System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
bij System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
bij MijnClient.Service.IService.GetData(Int32 value)
bij MijnClient.Service.ServiceClient.GetData(Int32 value) in C:\Users\Administrator\AppData\Local\Temporary Projects\MijnClient\Service References\Service\Reference.vb:regel 57
bij MijnClient.Form1.Form1_Load(Object sender, EventArgs e) in C:\Users\Administrator\AppData\Local\Temporary Projects\MijnClient\Form1.vb:regel 9


Ik had ook al geprobeerd met de domain cross xml file maar dat werkte bij de versie voorheen niet, de server werkte nog steeds via mijn thuis pc echter niet vanaf de remote pc. Ik neem aan dat hiervoor geen poorten expleciet open hoeven te staan.

Iemand een idee? Bedankt nogmaals.

Edit: Wat ik ook raar vind is dat als ik op de server instel dat security none is en message type none inplaats van windows, dat hij op de client security wel op none zet maar <message> type wel gewoon op windows. Als ik de service update.

[ Voor 3% gewijzigd door Josvds op 09-02-2010 13:44 . Reden: Toevoeging ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Volgens mij moet je ook het volgende hebben voor geen security (2x):
XML:
1
2
3
4
    <security mode="None">
        <transport clientCredentialType="None" />
        <message establishSecurityContext="false" />
    </security>

of gewoon
XML:
1
2
    <security mode="None">
    </security>

En niet wat je nu hebt.

Enkel waarom gebruik je nu alsnog een WSDualHttpBinding? Het is een stuk lastiger op te zetten en trager dan NetTcpBinding. Je moet opeens zorgen dat er een poort op de client open is, dat zijn adres correct wordt doorgegeven, en dat de poort niet wordt tegengehouden door een firewall, en dat dit op de server ook zo is (waarschijnlijk misgegaan hier). Een tcp-verbinding lijkt me een stuk makkelijker te managen.

Die clientaccesspolicy.xml is trouwens iets voor Silverlight, en daar kan een WSDualHttpBinding sowieso niet (omdat je niet zomaar een poort mag openen op de client).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
pedorus schreef op dinsdag 09 februari 2010 @ 18:03:
Volgens mij moet je ook het volgende hebben voor geen security (2x):
XML:
1
2
3
4
    <security mode="None">
        <transport clientCredentialType="None" />
        <message establishSecurityContext="false" />
    </security>

of gewoon
XML:
1
2
    <security mode="None">
    </security>

En niet wat je nu hebt.

Enkel waarom gebruik je nu alsnog een WSDualHttpBinding? Het is een stuk lastiger op te zetten en trager dan NetTcpBinding. Je moet opeens zorgen dat er een poort op de client open is, dat zijn adres correct wordt doorgegeven, en dat de poort niet wordt tegengehouden door een firewall, en dat dit op de server ook zo is (waarschijnlijk misgegaan hier). Een tcp-verbinding lijkt me een stuk makkelijker te managen.

Die clientaccesspolicy.xml is trouwens iets voor Silverlight, en daar kan een WSDualHttpBinding sowieso niet (omdat je niet zomaar een poort mag openen op de client).
Dat heb ik ergens gevonden en kreeg weer te horen dat juist netTCPBinding voor intranet is en je daarvoor poorten open moet zetten. Met welk van deze twee kan ik nu dan zonder vele aanpassingen op het netwerk van de klant en zonder het draaien van een losse server (maar geintegreerd in IIS) een service draaien?

Heb je toevallig ook een goed voorbeeld van netTCPBinding?

Erg bedankt iig vast voor de hulp tot nu toe.

Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Bedankt voor alle hulp, ik heb het nu voor elkaar een observer patroon te creeren doormiddel van inderdaad netTCPBinding, het was even puzelen hoe dit te verweven in de webserver maar ook dat is nu gelukt. Nu ga ik onderzoek doen na hoe dit te beveiligen.

Edit: Mocht iemand advies hebben m.b.t. de beveiliging van netTCPBing dan hoor ik het graag? SSL, authenticatie, etc. hij is geimplementeerd als service in IIS.

Bedankt iig.

[ Voor 23% gewijzigd door Josvds op 10-02-2010 15:21 . Reden: Vraag ]


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Ik heb ook gekeken naar de beveilging, je kan hierbij op twee manieren beveiligingen volgens mij. Transport dus de enqryptie van de data die over het netwerk gaat, en een gebruikersnaam en wachtwoord ter authenticatie.

Echter wil ik nu eigenlijk de service benaderen via een ASP.NET website. Ik heb dus nu een notifier echter wanneer ik dan op een knop druk op de website moet er data worden opgeslagen maar ook alle clients een notify krijgen, hoe kan ik dit realiseren weet iemand dat?

Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Weet iemand of het mogelijk is dat als je bij een Webservice een Library gebruikt en elders dezelfde library gebruikt je deze objecten over het netwerk stuurt i.p.v. de objecten van de webservice zelf?

Normaal als je dus een webservice methode aanmaakt met een parameter (dat een object uit de library is) dan moet je het object gebruiken van de webservice zelf. Echter heb ik dezelfde library gerefereerd in de applicatie waarin ik de webservice gebruik. Maar nu moet ik alle data handmatig omzetten kan dat niet anders?

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Als je de afspraak hanteert dat jouw webservice objecten dezelfde propertienamen hebben als die uit de 3rd party component, dan zou je reflection kunnen gebruiken om automatisch te mappen. Normaalgesproken ben ik niet zo'n fan van reflection maar voor dit soort doeleinden kan het een krachtig hulpmiddel zijn.
Pagina: 1