Fragensteller
Polling Duplex und VB.Net

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- Bearbeitet Robert Breitenhofer Dienstag, 8. Dezember 2009 13:04 Formatierung
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?- Bearbeitet Robert Breitenhofer Dienstag, 8. Dezember 2009 13:05 Hyperlink als Hyperlink
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