Подтвердить что ты не робот

WCF Как включить метаданные?

Я пытаюсь получить файл svc, работающий под IIS. В моем проекте, когда я нажимаю F5, я получил работу svc. Значит, я знаю, что все в порядке, не так ли? За исключением IIS.

Я работаю над машиной Windows XP Pro, а в IIS я добавил виртуальный каталог.

Здесь мой код: IcarePlanActions (проект: A)

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

Клиент: (проект: 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(проект: 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" %>

Когда я запускаю эту службу (которая находится в IIS) с помощью wfctestclient, я получаю эту ошибку

Ошибка: невозможно получить метаданные из http://localhost/CarePlanService/CarePlan.svcЕсли это сообщение Windows (R) Фундаментальное обслуживание, к которому вы имеете пожалуйста, проверьте, что у вас есть включенных метаданных на указанный адрес.

Что я делаю неправильно?

Решение

Я не получил сервис, работающий под IIS. Сначала я вручную создаю виртуальный каталог и указываю на directiry, где находится svc. Это не сработало. Я не знаю, почему.

Затем я перешел в Visual Studio и изменил настройку сервера (правая кнопка мыши на проекте, свойствах, вкладке Web, нажмите Use local IIS Web Server и нажмите Create Virtual Directory. Когда я это сделал, он работал в IIS с приведенным выше кодом.

4b9b3361

Ответ 1

РЕШЕНИЕ

Я не получил сервис, работающий под IIS. Сначала я вручную создаю виртуальный каталог и указываю на directiry, где находится svc. Это не сработало. Я не знаю, почему.

Затем я перешел в Visual Studio и изменил настройку сервера (Правая мышь в проекте, свойства, вкладка Веб, нажмите "Использовать локальный веб-сервер IIS" и нажмите "Создать виртуальный каталог". Когда я это сделал, он работал в IIS с кодом выше.

Ответ 2

Сначала удалите атрибут [DataContract] в Client.

Затем перекомпилируйте и убедитесь, что у вас есть файл WcfServiceLibrary.dll в каталоге /bin для вашего виртуального каталога.

Ваша конфигурация должна использовать эту конечную точку для метаданных:

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

Ответ 3

Вы ссылаетесь на контракт данных как на внедрение службы. Это неверно.

[DataContract]
public class Client : ICarePlanActions
{

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

Измените это, чтобы ссылаться на реализацию вашего сервиса! Как выглядит реализация вашего сервиса?

Возможно, вам следует просто удалить атрибут DataContract из класса Client. Кроме того, это не ваш "клиент", это реализация службы.

Ответ 4

  • Выполнить "\%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i

  • Удалите виртуальный каталог и создайте его снова.

Ответ 5

Просто проверьте имя службы в Service.svc файле

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

Надеюсь, он сработает.

Ответ 6

Убедитесь, что ваше служебное пространство namespace, а службы class соответствуют файлу App.config.

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