locked
Polling Duplex und VB.Net RRS feed

  • Frage

  • Ich grüble jetzt schon eine ganze Zeit, was hier falsch laufen kann..
    Um Parameteränderungen vom Serverprojekt auf den Silverlight -Client zu bekommen, möchte ich die Polling Duplex Services nutzen. Zur Einarbeitung hatte ich mir einige Codebeispiele angesehen /versucht bei mir auszuführen. Unter anderem auch eine Anwendung, die Serverseitig einen Schuldenstand berechnet, und alle 5 Sekunden an das Silverlight -Frontend pusht. Im C# funktioniert dies einwandfrei, nach übersetzung in vb.Net bekomme ich eine Fehlermeldung:

    Fehler beim Senden einer Anforderung an den URI "
    http://localhost/DuplexDemo/DeptServiceReference.svc". Ursache ist möglicherweise, dass ohne die entsprechende domänenübergreifende Richtlinie oder mit einer nicht für SOAP-Dienste geeigneten Richtlinie domänenübergreifend auf einen Dienst zugegriffen wurde. Möglicherweise müssen Sie sich an den Besitzer des Diensts wenden, damit eine domänenübergreifende Richtliniendatei veröffentlicht und das Senden von sich auf SOAP beziehenden HTTP-Headern zugelassen wird. Dieser Fehler kann auch durch Verwendung von internen Typen im Webdienstproxy ohne das InternalsVisibleToAttribute-Attribut verursacht werden. Weitere Details finden Sie in der inneren Ausnahme.

    Dabei wird mit folgende Zeile aus dem Generieten Code vom Webservice auf der Clientseite angemerkt:

    Public Sub EndConnect(ByVal result As System.IAsyncResult) Implements DeptServiceReference.IDuplexService.EndConnect
                    Dim _args((0) - 1) As Object
                    MyBase.EndInvoke("Connect", _args, result)

     
    Habe ich das etwas vergessen, weggelassen,oder ist in meinerm Webservice ein grundlegender Fehler?
    Kann mir das nicht erklären, denn in C# funktiniert die Anwendung. Ähnlich verhält es sich aber bei vergleichbaren Projekten -beim ersten Server-Push stürzt es ab.
    Habe das Problem im VS 2010 Betta 2 und dem VS 2008 SP1 gleichermaßen.
    Anbei noch der Code des Webservice und des Interface:

    Imports System.Runtime.Serialization
    Imports System.ServiceModel
    Imports System.ServiceModel.Activation
    Imports System.Text
    Imports System.Threading
     
    Namespace DuplexDemo.Web
           <AspNetCompatibilityRequirements(RequirementsMode := AspNetCompatibilityRequirementsMode.Allowed)> _
           Public Class DebtService
                 Implements IDuplexService
                 Private _timer As Timer ' Timer reference
                 Private _client As IDuplexClient ' Callback channel reference
                 Private Shared _debt As NationalDebt ' Singleton for computing national debt
     
                 Shared Sub New()
                        ' Create a DebtService instance
                        _debt = New NationalDebt()
                 End Sub
     
                 Public Sub Connect() Implements IDuplexService.Connect
                        ' Store a reference to the callback channel
                        _client = OperationContext.Current.GetCallbackChannel(Of IDuplexClient)()
     
                        ' Start a timer
                        _timer = New Timer(New TimerCallback(AddressOf OnTimerTick), Nothing, 5000, 5000)
                 End Sub
     
                 Private Sub OnTimerTick(ByVal state As Object)
                        If _client IsNot Nothing Then
                               Try
                                      ' Push an updated national debt figure down to the client
                                      _client.Refresh(_debt.GetCurrentDebt())
                               Catch e1 As Exception
                                      ' Stop the timer if the callback fails (probably because
                                      ' the client has been closed)
                                      _client = Nothing
                                      _timer.Dispose()
                               End Try
                        End If
                 End Sub
           End Class
     
           Friend Class NationalDebt
                 Private _timer As Timer ' Timer reference
                 Private _amount As Double = 10299874737358 ' National debt as of 10/18/08
                 Private Const _daily As Double = 3370000000 ' Daily increase in national debt
                 Private Const _inc As Double = 195023 ' Increase every 5 seconds
                 Private _sync As New Object() ' Synchronization object
     
                 Public Sub New()
                        ' Compute today's national debt            
                        _amount += _daily * (Date.Now - New Date(2008, 10, 16)).Days
     
                        ' Start a timer
                        _timer = New Timer(New TimerCallback(AddressOf OnTimerTick), Nothing, 5000, 5000)
                 End Sub
     
                 Private Sub OnTimerTick(ByVal state As Object)
                        SyncLock _sync
                               ' Update the national debt
                               _amount += _inc
                        End SyncLock
                 End Sub
     
                 Public Function GetCurrentDebt() As Double
                        SyncLock _sync
                               ' Return the current national debt figure
                               Return _amount
                        End SyncLock
                 End Function
           End Class
    End Namespace
     
    Imports System.ServiceModel
     
    Namespace DuplexDemo.Web
           <ServiceContract(Namespace := "Silverlight", CallbackContract := GetType(IDuplexClient))> _
           Public Interface IDuplexService
                 <OperationContract(IsOneWay := True)> _
                 Sub Connect()
           End Interface
     
           <ServiceContract> _
           Public Interface IDuplexClient
                 <OperationContract(IsOneWay := True)> _
                 Sub Refresh(ByVal amount As Double)
           End Interface
    End Namespace
    Dienstag, 8. Dezember 2009 10:19

Alle Antworten

  • hast du denn eine Richtlinie für den domänenübergreifenden Zugriff hinzugefügt?

    -- 
    Peter
    Dienstag, 8. Dezember 2009 10:56
  • Vielen Dank für diesen Ansatz!
    Ich habe eben einmal nach eben dieser "Richtlinie für den domänenübergreifenden Zugriff " gesucht und bin auf den ersten Link gegangen http://msdn.microsoft.com/de-de/library/cc838225%28VS.95%29.aspx
    Habe den dort aufgeführten Code erst einmal so übernommen, und es funktioniert!

    Was mich aber wundert ist die Tatsache, das meine C# -Vorlage(n) nie diese beiden Anweisungen enthielten -warum kann das dort anders sein?

    Außerdem wird mir generell eine Warunung  für meine Deklaration des PollingDuplexHttpbindings in der Web.Config -Datei ausgegeben. Wie muss man das einordnen?
    Dienstag, 8. Dezember 2009 12:48
  • Jetzt stehe ich noch mehr auf dem Schlauch!
    Nachdem ich eben die beiden Files in das Client- und Serverprojekt gepackt hatte, funktionierte es es einmal. Dann habe ich das Testens haber den PC neu gestartet, und ich bekomme den gleichen Fehler wie zuvor!
    Kann aber auch keinen sinnvoll-erklärbaren Lösungsweg zur Abhilfe, oder auch nur für dieses Phänomen finden.

    Mir wäre daher ein kleines Projekt in VB, das mit duplex polling arbeitet sehr hilfreich, falls jemand aus dem Stegreif soetwas hat, wäre mir das eine große Hilfe.
    Dienstag, 8. Dezember 2009 14:03