WCF Как включить метаданные? - PullRequest
12 голосов
/ 19 января 2010

Я пытаюсь заставить мой файл 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) Communication Фонд обслуживания, к которому у вас есть доступ, пожалуйста, проверьте, что у вас есть включена публикация метаданных на указанный адрес.

Что я делаю не так?

РЕШЕНИЕ

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

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

Ответы [ 6 ]

7 голосов
/ 19 января 2010

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

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

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

<endpoint address="mex" 
    binding="mexHttpBinding" 
    contract="IMetadataExchange"/>
5 голосов
/ 08 июля 2010

РЕШЕНИЕ

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

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

2 голосов
/ 19 января 2010

Вы указываете данные контракта как реализацию услуги. Это неверно.

[DataContract]
public class Client : ICarePlanActions
{

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

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

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

0 голосов
/ 18 января 2018

Убедитесь, что имя службы пространства имен и имена класса службы соответствуют файлу 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
{
0 голосов
/ 08 января 2017

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

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

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

0 голосов
/ 17 августа 2010
  1. Пробег "\%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...