2010-01-18 4 views
12

Ich versuche, meine SVC-Datei unter IIS arbeiten zu lassen. In meinem Projekt, als ich F5 drücke, habe ich die SVC funktionstüchtig gemacht. Ich weiß also, dass alles in Ordnung ist, oder? Außer für IIS.WCF Wie aktiviert man Metadaten?

Ich arbeite an einem Windows XP Pro Computer und in IIS habe ich ein virtuelles Verzeichnis hinzugefügt.

Hier ist mein Code: IcarePlanActions (Projekt: A)

namespace WcfServiceLibrary 
{ 
    [ServiceContract] 
    public interface ICarePlanActions 
    { 
     [OperationContract] 
     List<string> GetAllClients(); 
    } 
} 

Auftraggeber: (Projekt: A)

namespace WcfServiceLibrary 
{ 
    public class Client : ICarePlanActions 
    { 
     public List<string> GetAllClients() 
     { 
      List<string> clients = new List<string>(); 
      clients.Add("Hendrik de Jong"); 
      clients.Add("Miep de Berg"); 
      clients.Add("Jaap Jongeneel"); 
      clients.Add("Joop Prakman"); 
      clients.Add("Pieter Schaakman"); 

      return clients; 

     } 
    } 
} 

Web.config (Projekt: B)

<configuration> 
    <system.serviceModel> 
     <services> 
     <service behaviorConfiguration="CarePlanService.Service1Behavior" 
      name="WcfServiceLibrary.Client"> 
      <endpoint address="" binding="wsHttpBinding" contract="WcfServiceLibrary.ICarePlanActions"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
      </endpoint> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
     </services> 
     <behaviors> 
     <serviceBehaviors> 
      <behavior name="CarePlanService.Service1Behavior"> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
      </behavior> 
     </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 
    </configuration> 

CarePlan.svc

<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLibrary.Client" %> 

Wenn ich laufen diesen Dienst (die auf IIS) mit wfctestclient Ich erhalte diese Fehler

Error: Cannot obtain Metadata from http://localhost/CarePlanService/CarePlan.svc If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address.

Was mache ich falsch?

SOLUTION

ich den Dienst nicht arbeiten unter IIS bekommen haben. Zuerst erstelle ich manuell ein virtuelles Verzeichnis und deutete auf die Datei, in der sich die SVC befindet. Das hat nicht funktioniert. Ich weiß nicht warum.

Dann ging ich zu Visual Studio und änderte die Servereinstellung (rechte Maustaste auf das Projekt, Eigenschaften, Registerkarte Web, klicken Sie auf Use local IIS Web Server und klicken Create Virtual Directory. Als ich das tat, es oben unter IIS mit dem Code gearbeitet.

+0

Bearbeiteter Titel - das hat nichts mit der Programmiersprache C# zu tun. –

+1

Ich habe WCF nicht so verwendet, aber sollten Sie Ihre Service-Implementierung in den Datenvertrag einfügen? und wenn ja, gibt es keinen im Vertrag definierten Datamember. Sieht mir komisch aus. Aber ich habe nie in IIS gehostet ... – magnus

+0

@Martijn: wirklich dumme Frage: Wenn Sie versuchen, mit dem WcfTestClient verbinden, ist die Website up? Wenn Sie die hier vorgeschlagenen Änderungen vornehmen (löschen Sie [DataContract], verwenden Sie "mexHttpBinding" für den mex-Endpunkt), habe ich keine Probleme, die Metadaten überhaupt zu bekommen. Aber du musst zuerst einen "View in Browser" in der * .svc Datei machen, um den eingebauten Webserver zu starten - und dann kannst du dich mit deinem WcfTestClient mit der URL verbinden –

Antwort

5

SOLUTION

ich den Dienst nicht bekommen haben unter IIS arbeiten. Zuerst erstelle ich manuell ein virtuelles Verzeichnis und deutete auf die Datei, in der sich die SVC befindet. Das hat nicht funktioniert. Ich weiß nicht warum.

Dann ging ich zu Visual Studio und änderte die Server-Einstellung (Rechte Maustaste auf das Projekt, Eigenschaften, Registerkarte Web, klicken Sie auf Lokale IIS-Webserver verwenden und klicken Sie auf Create Virtual Directory.Als ich das tat, funktionierte es unter IIS mit dem obigen Code.

+0

das funktionierte für mich, also was bedeutet, dass es im IIS-Server funktioniert, aber nicht im Visual Studio-Entwicklungsserver. du weißt, warum? – superachu

2

Sie verweisen auf den Datenvertrag als die Umsetzung des Dienstes. das ungültig ist.

[DataContract] 
public class Client : ICarePlanActions 
{ 

<service behaviorConfiguration="CarePlanService.Service1Behavior" 
     name="WcfServiceLibrary.Client"> 

ändern Sie diese bei der Umsetzung Ihrer Dienstleistung verweisen! Was die Umsetzung Ihres Service tut aussehen?

Vielleicht sollten Sie einfach das DataContract-Attribut aus der Client-Klasse entfernen. Auch dies ist nicht Ihr "Client", es ist die Implementierung des Dienstes.

+0

Ich habe meinen Startpost bearbeitet. Meinst Du das? – Martijn

+0

Ja. Das ist es was ich meinte. – Alex

6

Entfernen Sie zunächst das Attribut [DataContract] im Client.

Dann neu kompilieren und sicherstellen, dass Sie die WcfServiceLibrary.dll im Verzeichnis/bin für Ihr virtuelles Verzeichnis haben.

Ihre Konfiguration sollte diesen Endpunkt für MetadataExchange verwenden:

<endpoint address="mex" 
    binding="mexHttpBinding" 
    contract="IMetadataExchange"/> 
+0

Ich habe meine Dateien geändert, aber es funktioniert immer noch nicht. Ich habe meinen Startpost mit den Änderungen geändert. – Martijn

0
  1. Run "\%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i

  2. Virtual Directory entfernen und erneut erstellen.

0

Überprüfen Sie einfach den Namen des Dienstes in Service.svc Datei

<ServiceHost Language="C#" Debug="true" Service="SvcCalculator.**Calculator**" 
      CodeBehind="**Calculator.svc.cs**" %> 

Hoffe, es wird funktionieren.

0

Stellen Sie sicher, dass Ihr Dienst Namespace und Service Klasse Namen der App.config Datei entsprechen.

<system.serviceModel> 
    <services> 
    <service name="WcfCustomLibrary.Service1"> 
    <host> 
     <baseAddresses> 
     <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary/Service1/" /> 
     </baseAddresses> 
    </host> 
    </service> 
    </services> 
</system.serviceModel> 


namespace WcfCustomLibrary 
{ 
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together. 
public class Service1 : IService1 
{