wcf服务无法正常工作 - 无法添加服务

时间:2011-12-13 23:10:29

标签: c# wcf visual-studio-2010

我正在尝试制作我的第一个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 个答案:

答案 0 :(得分:1)

根据我们的经验,这种类型的失败有两个主要原因:

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服务失败的特定问题。

答案 1 :(得分:1)

看看我的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>

答案 2 :(得分:0)

您需要确保CReport可序列化,否则WCF无法创建元数据(通过您的案例中的WSDL)来交换您的服务。阅读将DataContract属性添加到CReport课程。

答案 3 :(得分:0)

仔细检查您是否已将CReport标记为可序列化。这将允许WCF序列化程序在WCF元数据中公开类定义。

答案 4 :(得分:0)

如果我没有记错的话。我在您的配置中找不到任何服务节点。 你应该在你的配置文件中包含这样的东西

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

希望这有帮助。

由于