служба wcf не работает - не удалось добавить службу - PullRequest
2 голосов
/ 14 декабря 2011

Я пытаюсь сделать мой первый сервис WCF. У меня проблемы - я написал структуру, класс и несколько методов. Мой сервисный контракт выглядит так:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WebshopReports
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IReports" in both code and config file together.
    [ServiceContract]
    public interface IReports
    {
        [OperationContract]
        List<Category> getReportCategories(string dir);

        [OperationContract]
        List<CReport> getReportList(Category category);

    }
}

Когда я запускаю его с помощью тестового клиента в visual studio, я получаю следующее:

Не удалось добавить сервис. Метаданные службы могут быть недоступны. Делать уверен, что ваш сервис работает и предоставляет метаданные.

Я уверен, что это как-то связано со мной файл web.config. Это ниже. Может кто-нибудь, пожалуйста, помогите мне, так как я не уверен, как настроить web.config:

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 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>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

Странно то, что если я изменю CReport с класса на структуру, он будет работать.

Ответы [ 5 ]

1 голос
/ 29 ноября 2012

Посмотрите на мой web.config, я думаю, что ваш конфигурационный файл неправильный:

<system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="NoneSecurity"
          maxBufferPoolSize="12000000" maxReceivedMessageSize="12000000" useDefaultWebProxy="false">
          <readerQuotas maxStringContentLength="12000000" maxArrayLength="12000000"/>
          <security mode="None"/>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="Elong.GlobalHotel.Host.IHotelAPIBehavior"
        name="Elong.GlobalHotel.Host.IHotelAPI">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="NoneSecurity" contract="Elong.GlobalHotel.Host.IIHotelAPI">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Elong.GlobalHotel.Host.IHotelAPIBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
1 голос
/ 14 декабря 2011

По нашему опыту, есть две основные причины этого типа сбоя:

1) Сериализация на стороне сервера.Это может быть связано с тем, что классы не сериализуемы, или с попытками сериализации абстрактных классов без использования атрибута KnownType.

2) Сериализация на стороне клиента из-за путаницы WCF между несколькими классами типов Collection или Dictionary, которые имеют одинаковыеобщая подпись.

Исходя из вашего описания, звучит так, как будто проблема с пунктом 1.

Лучший способ устранить такие проблемы WCF, как это, - добавить следующий блок в раздел конфигурации вашегоФайл web.config:

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData="c:\log\WebTrace.svclog"  />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

После того, как вы попытаетесь использовать интерфейс и он потерпит неудачу, дважды щелкните файл svclog, и откроется инструмент просмотра журнала WCF.Любые возникающие исключения будут выделены красным цветом, и вы сможете углубиться в них, чтобы увидеть конкретную проблему, приводящую к сбою службы WCF.

0 голосов
/ 14 декабря 2011

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

<configuration>
      <System.ServiceModel>
       <Services>
        <Service name="YourService.Somthing">
        <EndPoint name="default" address="" binding="basicHttpBinding" bindingConfiguration="" contract="YourContrat.Something"></Endpoint>
        <endpoint kind="mexEndpoint" address="/mex" />
        </Service>
       </Services>
<System.ServiceModel>
</configuration>

Надеюсь, это поможет.

Спасибо

0 голосов
/ 14 декабря 2011

Дважды проверьте, что вы отметили CReport как Сериализуемый.Это позволит сериализатору WCF предоставлять определение класса в метаданных WCF.

0 голосов
/ 14 декабря 2011

Вы должны убедиться, что CReport является сериализуемым, иначе WCF не сможет создать метаданные для обмена (через WSDL в вашем случае) вашей службой. Подробнее о добавлении атрибута DataContract в класс CReport.

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