Laden...

Silverlight und WCF-Dienste

Letzter Beitrag vor 13 Jahren 19 Posts 7.398 Views
Silverlight und WCF-Dienste

Hallo,

ich habe ein Azure-Cloud-Projekt, dass eine Webrole hat, die einen WCF-Dienst bereit stellt. Auf diesen Dienst soll eine Silverlight Anwendung zugreifen.

Das Problem ist, dass ich selbst beim lokalen Debuggen folgende Fehlermeldung bekomme:

Fehler beim Senden einer Anforderung an den URI "http://localhost:87/Service1.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.

Im Web habe ich viele Posts und Blogs zu diesem Thema gefunden. Allerdings war es da immer so, dass die Anwendung lokal funktioniert hat und erst beim Hochladen auf den Server nicht mehr funktionierte, oder einfach die "clientaccesspolicy.xml" hinzugefügt werden musste.

Die "clientaccesspolicy.xml" habe ich aber bereits hinzugefügt und nichts hat sich verbessert.

Bin über alle Ansätze dankbar.

Gruß

Puppetmaster

Zum System:
Windows 7 Enterprise
SQL-Server Express
IIS 7
VS 2010
Silverlight 4
.Net 4.0

Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: G
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^

Ich musste bei meiner SL-Anwendung noch eine crossdomain.xml zum WCF-Service hinzufügen, damit sie auf diesen zugreifen konnte.

There are 10 kind of people, those who understand binary and those who don't.

Hallo,

und wie fügt man dem WCF-Dienst die crossdomain.xml hinzu? Spontan hab ich nichts bei google gefunden.

Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: G
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Hey,

Danke für die Antwort aber auf den Artikel bin ich bei meiner Rechereche bestimmt schon 4 mal gestoßen.
Habe sowohl die clientaccesspolicy.xml als auch die crossdomain.xml in die root-Ordner und (aus Verzweiflung) auch in so ziemlich alle anderen Ordner eingefügt. Beide xml sind auch über den Webbrowser abrufbar. Also "localhost:port/clientaccesspolicy.xml"

Ich habe auch mal Firebug nebenher laufen lassen. Da wird mir nirgends angezeigt, dass er probiert auf die clientaccesspolicy.xml zuzugreifen. Ist das normal?

Muss man das vll erst in irgend einer Einstellung festlegen?

Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: G
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^

Hallo,

hast du die clientaccesspolicy.xml auch auf Serverseite des WCF-Services hinzugefügt? Dort gehört diese nämlich hin.

Ich weiß jetzt nicht ob du das beim Azure-Cloud-Projekt auch erledigen kannst. Falls das nicht gehen sollte wäre eine Möglichkeit nicht direkt von SL auf die Cloud zuzugreifen, sondern über einem Vermittler-WCF-Service der auf der gleichen Domain wie die SL-Anwendung ist und dieser auf die Cloud zugreift.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Hi,

wie läuft denn dein WCF Service bei dir? Als Windows-Dienst?

Wenn ja hilft dir das eventuell weiter:


public static void Main()
{
   ServiceHost orderServiceHost = new ServiceHost(typeof(ServiceXXX));
   ServiceHost crossDomainserviceHost = new ServiceHost(typeof(CrossDomainService));

            orderServiceHost.Open();
            crossDomainserviceHost.Open();

}



 // NOTE: If you change the interface name "ICrossDomainService" here, you must also update the reference to "ICrossDomainService" in App.config.
    [ServiceContract]
    public interface ICrossDomainService
    {
        [OperationContract]
        [WebGet(UriTemplate = "ClientAccessPolicy.xml")]
        Message ProvidePolicyFile();
    }

 public class CrossDomainService : ICrossDomainService
    {
        public System.ServiceModel.Channels.Message ProvidePolicyFile()
        {
            FileStream filestream = File.Open(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\ClientAccessPolicy.xml", FileMode.Open, FileAccess.Read, FileShare.Read);
            // Either specify ClientAcessPolicy.xml file path properly
            // or put that in \Bin folder of the console application
            XmlReader reader = XmlReader.Create(filestream);
            System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
            return result;
        }
    }

Gruß
wettmasta

Hallo,

wie läuft denn dein WCF Service bei dir? Als Windows-Dienst?

Wo ich das implementiert habe schaut so aus:
Apache-Server mit Domain A auf dem das SL-Projekt liegt, da dort aber keine WCF-Service geht hab ich auf einem IIS-Server mit Domain B den WCF-Service erstellt und greife von SL darauf zu. Damit das funktioniert liegt im Root-Ordner bei Domain B die clientaccesspolicy.xml. Das wars auch schon.

Das [WebGet(UriTemplate = "ClientAccessPolicy.xml")] im ServiceContract ist nicht notwendig.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Hi gfoidl,

die Frage war auch für Puppetmaster gedacht...

Ich habe das so gelöst, da ich den WCF-Service als Windows-Dienst implementiert habe.
Am Anfang der Entwicklung hatte ich den WCF-Service immer nur über die Console gestartet , als ich ihn aber als Windows-Dienst starten wollte, hatte ich genau den selben Fehler wie Puppetmaster. Das Problem war, das der Dienst die ClientAccessPolicy.xm nicht finden konnte...

Gruß
wettmasta

hast du die clientaccesspolicy.xml auch auf Serverseite des WCF-Services hinzugefügt? Dort gehört diese nämlich hin.

Wie gesagt habe ich die clientaccesspolicy.xml lediglich in den root Ordner der WebRole eingefügt.

wie läuft denn dein WCF Service bei dir? Als Windows-Dienst?

Der Service läuft im IIS7, soweit ich weiss. Ich lasse mir die Services immer über "Rechtsklick->Im Browser anzeigen" anzeigen. Da werden sie automatisch gestartet.

@wettmasta
Dein Beispiel verstehe ich nicht ganz. Wo wird denn die CrossDomainService-Klasse verwendet?

Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: G
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^

Ich probiere mal mein Vorgehen zu erklären, vll liegt ja schon da der Fehler.

(VS Studio starten)
Neues Cloud Projekt erstellen
WebRole hinzufügen
Rechtsklick auf Webrole -> Neues Element hinzufügen -> Silverlight Service
Rechtsklick auf Services -> In Browser anzeigen (Startet Services)
Rechtsklick auf Projekt -> Neues Projekt hinzufügen -> Silverlight Anwendung
Rechtsklick auf Silverlight-Projekt -> Dienstverweis? hinzufügen (Service Auswählen)
Entwas Code schreiben um auf Service zuzugreifen
clientaccesspolicy.xml aus Onlinevorlage runterladen und anpassen
crossdomain.xml in Webrole root hinzufügen
Debuggen
Fehler

Hab ich irgendwas vergessen?

Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: G
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^

Kann mir Jemand sagen, ob das prinzipielle Vorgehen hier korrekt ist?

Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: G
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^

Hallo,

korrekt bis auf

clientaccesspolicy.xml aus Onlinevorlage runterladen und anpassen
crossdomain.xml in Webrole root hinzufügen

crossdomain.xml runterladen und anpassen 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Oh, wusste gar nicht, dass es die auch in den online-Vorlagen gibt.

Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: G
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^

Hallo,

h, wusste gar nicht, dass es die auch in den online-Vorlagen gibt.

Ich weiß es auch nicht 😁
Aber es ist ja nur eine XML-Datei und dazu ist ja keine Vorlage notwendig -> Network Security Access Restrictions in Silverlight

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

@ wettmasta
Wo soll der Code, den Du gepostet hast überhaupt rein?

Die Main wollte ich in die Silverlight Anwendung packen. Da kann ich aber nicht auf die ServiceHost Klasse zugreifen.

Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: G
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^

Oh man sorry, habe den Thread voll vergessen.

Ich starte den WCF Service zum Entwicklen in einer Console. Im Produktivsystem als windows-dienst.

Dieser Teil stammt aus der Console, womit ich den WCF Service starte.


public static void Main()
{
   ServiceHost orderServiceHost = new ServiceHost(typeof(ServiceXXX));
   ServiceHost crossDomainserviceHost = new ServiceHost(typeof(CrossDomainService));

            orderServiceHost.Open();
            crossDomainserviceHost.Open();

}

Den WCF Service habe ich als eigene Dll gebaut.

Dieser beinhaltet unter anderem die Datei IXXXService.cs mit dem ServiceContract des Services.

Dann noch die Datei ICrossdomainService.cs mit


 // NOTE: If you change the interface name "ICrossDomainService" here, you must also update the reference to "ICrossDomainService" in App.config.
    [ServiceContract]
    public interface ICrossDomainService
    {
        [OperationContract]
        [WebGet(UriTemplate = "ClientAccessPolicy.xml")]
        Message ProvidePolicyFile();
    }

Die Datei CrossDomainService.cs beinhaltet:


 public class CrossDomainService : ICrossDomainService
    {
        public System.ServiceModel.Channels.Message ProvidePolicyFile()
        {
            FileStream filestream = File.Open(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\ClientAccessPolicy.xml", FileMode.Open, FileAccess.Read, FileShare.Read);
            // Either specify ClientAcessPolicy.xml file path properly
            // or put that in \Bin folder of the console application
            XmlReader reader = XmlReader.Create(filestream);
            System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
            return result;
        }
    }


Die ClientAcessPolicy.xml muss dann entsprechent dort liegen, von wo auch der WCF Service aufgerufen wird.

Weiß nicht ob dir das weiter hilft, habe noch kein Cloud-Projekt entwickelt...

Gruß
wettmasta

Ach ja, gib das mal in der Console mit Adminrechten ein:

netsh http add urlacl url=http://IP-ADRESSE:Port/XXXService/ user=NT-AUTORITÄT\SYSTEM

Ich hatte das Problem, das der WCF-Service unter Windwos 7 ohne diesen Befehl gar nicht starten wollte. Man kann/sollte nen anderen User nehmen aber zum testen würde ich den erstmal nehmen.

Gruß
wettmasta

Hey wettmasta,

deine Lösung erinnert mich an dieses Step-By-Step Tutorial.
Step By Step - Using Silverlight to Access a WCF Service Hosted In a Console Application

Das habe ich schon nachgebaut und es kommt nach wie vor der gleiche Fehler.

Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: G
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^