2010-01-18 13 views
12

Próbuję uzyskać mój plik svc działa pod IIS. W moim projekcie, gdy naciskałem klawisz F5, działał svc. Więc wiem, że wszystko jest w porządku, prawda? Z wyjątkiem IIS.WCF Jak włączyć metadane?

Pracuję na komputerze z systemem Windows XP Pro, aw usługach IIS dodałem katalog wirtualny.

Oto mój kod: IcarePlanActions (projekt: a)

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

Klient: (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" %> 

Kiedy uruchomić tę usługę (co jest na IIS) z wfctestclient otrzymuję ten błąd

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.

Co robię źle?

ROZWIĄZANIE

nie miałem służby pracujące pod IIS. Najpierw ręcznie utworzyłem katalog wirtualny i wskazałem kierunek, w którym znajduje się svc. To nie zadziałało. Nie wiem dlaczego.

Potem poszedłem do Visual Studio i zmianie ustawienia serwera (prawy klawisz myszki na projekcie, właściwości, zakładka Web, kliknij Use local IIS Web Server i kliknij Create Virtual Directory. Kiedy to zrobił, to działało w ramach IIS z powyższym kodzie.

+0

Edytowany tytuł - nie ma to nic wspólnego z językiem programowania C#. –

+1

Nie użyłem WCF w ten sposób, ale czy należy wprowadzić implementację usługi wewnątrz datacontract? a jeśli tak, to nie ma datamember zdefiniowany w umowie. Dla mnie wygląda dziwnie. Ale nigdy nie byłem hostowany w IIS ... – magnus

+0

@Martijn: naprawdę głupie pytanie: kiedy próbujesz się połączyć za pomocą WcfTestClient, czy strona internetowa jest w górze? Jeśli wprowadzisz zmiany proponowane tutaj (usuń [DataContract], użyj "mexHttpBinding" dla mexa końcowego), nie mam problemu z uzyskaniem metadanych w ogóle. Ale musisz najpierw zrobić "Widok w przeglądarce" na pliku * .svc, aby uruchomić wbudowany serwer WWW - a następnie możesz połączyć się z adresem URL za pomocą swojego WcfTestClient –

Odpowiedz

5

ROZWIĄZANIE

nie miałem służby pracujące pod IIS. Najpierw ręcznie utworzyłem katalog wirtualny i wskazałem kierunek, w którym znajduje się svc. To nie zadziałało. Nie wiem dlaczego.

Następnie poszedłem do Visual Studio i zmieniłem ustawienia serwera (prawy przycisk myszy na projekcie, właściwości, zakładka Sieć, kliknij Użyj lokalnego serwera IIS i kliknij Utwórz katalog wirtualny.Kiedy to zrobiłem, działało pod IIS z powyższym kodem.

+0

to działało dla mnie, co oznacza, że ​​działa na serwerze IIS, ale nie na serwerze programistycznym Visual Studio. wiesz dlaczego? – superachu

2

się odwoływać umowę danych jako realizacji usługi. to nieważne.

[DataContract] 
public class Client : ICarePlanActions 
{ 

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

Zmiana ta odwołać realizację usług! Co realizacja usługi wyglądać?

Może powinieneś po prostu usunąć atrybut DataContract z klasy Klient. Również nie jest to twój "Klient", jest to wdrożenie usługi.

+0

Edytowałem mój startpost. Czy o to Ci chodziło? – Martijn

+0

Tak. O to mi chodziło. – Alex

6

Najpierw usuń atrybut [DataContract] w Client.

Następnie należy ponownie skompilować i upewnić się, że plik WcfServiceLibrary.dll znajduje się w katalogu/bin katalogu wirtualnego.

Twój config powinien korzystać z tego punktu końcowego dla metadataexchange:

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

Zmieniłem moje pliki, ale nadal nie działa. Zmodyfikowałem mój startpost ze zmianami. – Martijn

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

  2. Usuń Virtual Directory i utworzyć go ponownie.

0

Wystarczy sprawdzić nazwę usługi w Service.svc pliku

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

nadzieję, że to działa.

0

Upewnij się, że usługa nazw, a obsługa klasa nazwy odpowiadają app.config pliku.

<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 
{