it-swarm.com.de

WCF Wie werden Metadaten aktiviert?

Ich versuche, meine SVC-Datei unter IIS zum Laufen zu bringen. Wenn ich in meinem Projekt F5 drücke, funktioniert der SVC. Ich weiß also, dass alles in Ordnung ist, oder? Mit Ausnahme von IIS.

Ich arbeite auf einem Windows XP Pro-Computer und habe in IIS 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 diesen Dienst (der sich auf IIS befindet) mit wfctestclient ausführe, wird dieser Fehler angezeigt

Fehler: Es können keine Metadaten von http: //localhost/CarePlanService/CarePlan.svc abgerufen werden. Wenn dies ein Windows (R) Communication Foundation-Dienst ist, auf den Sie zugreifen können, überprüfen Sie, ob Sie die Veröffentlichung von Metadaten unter der angegebenen Adresse aktiviert haben .

Was mache ich falsch?

L&OUML;SUNG

Ich habe den Dienst unter IIS nicht zum Laufen gebracht. Zuerst erstelle ich manuell ein virtuelles Verzeichnis und wies auf die Richtung, in der sich der 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 Sie auf Create Virtual Directory. Als ich dies tat, funktionierte es unter IIS mit dem obigen Code.

12
Martijn

LÖSUNG

Ich habe den Dienst nicht unter IIS arbeiten lassen. Zuerst habe ich manuell ein virtuelles Verzeichnis erstellt und auf die Direktive verwiesen, 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 im Projekt, Eigenschaften, Registerkarte Web, klicken Sie auf Lokale Server IIS verwenden) und klicken Sie auf Create Virtual Directory (Virtuelles Verzeichnis erstellen). Wenn ich dies tat, funktionierte es unter IIS mit dem Code oben.

5
Martijn

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

Kompilieren Sie dann erneut und stellen Sie sicher, dass sich die WcfServiceLibrary.dll im Verzeichnis/bin für Ihr virtuelles Verzeichnis befindet.

Ihre Konfiguration sollte diesen Endpunkt für Metadatenaustausch verwenden:

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

Sie beziehen sich auf den Datenvertrag als Implementierung des Dienstes. Das ist ungültig.

[DataContract]
public class Client : ICarePlanActions
{

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

Ändern Sie dies, um auf die Implementierung Ihres Dienstes zu verweisen! Wie sieht die Implementierung Ihres Dienstes aus?

Vielleicht sollten Sie einfach das DataContract-Attribut aus der Client-Klasse entfernen. Dies ist auch nicht Ihr "Kunde", sondern die Implementierung des Dienstes.

2
Alex
  1. "\%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i ausführen

  2. Entfernen Sie das virtuelle Verzeichnis und erstellen Sie es erneut.

0
Rooz

Überprüfen Sie einfach den Dienstnamen in der Service.svc-Datei

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

Ich hoffe es klappt.

0
user3653166

Stellen Sie sicher, dass Ihre Dienste Namespace und Service Class - Namen der Datei App.config 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
{