WCF 4.0,无法调用该服务

时间:2011-05-27 07:01:45

标签: wcf web-services

在解决方案中,我添加了“WCF服务库”。没有问题的默认方法。我加了一个:

在界面中:

[ServiceContract]
public interface ISecurityAccessService
{
    [OperationContract]
    string GetData(int value);

    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);

    [OperationContract]
    CompositeUser ListUser();

}

[DataContract]
public class CompositeUser
{
    List<User> _listUser = new List<User>();

    [DataMember]
    public List<User> ListUser
    {
        get { return _listUser; }
        set { _listUser = value; }
    }
}

接口实现,数据访问工作,我测试了DataService,没问题。

public class SecurityAccessService : ISecurityAccessService
{
    public CompositeUser ListUser()
    {
        DataAccess.DataService service = new DataAccess.DataService();

        CompositeUser compositeUser = new CompositeUser();
        compositeUser.ListUser = service.ListUser();

        return compositeUser;
    }
}

当我执行并尝试调用时,收到此错误消息: *收到http://localhost:8732/Design_Time_Addresses/WcfServiceLibrary/ISecurityAccessService/的HTTP响应时发生错误。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。*

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="WcfServiceLibrary.SecurityAccessService">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8732/Design_Time_Addresses/WcfServiceLibrary/ISecurityAccessService/" />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- Unless fully qualified, address is relative to base address supplied above -->
        <endpoint address ="" binding="wsHttpBinding" contract="WcfServiceLibrary.ISecurityAccessService">
          <!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <!-- Metadata Endpoints -->
        <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> 
        <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <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>
  </system.serviceModel>

</configuration>

更新1

我制作了一个具有数据库访问权限的工作示例。我只是不明白“PersonService”类中的一些东西,为什么我要做这个循环。欢迎解决方案。

Download 40ko .rar full example

2 个答案:

答案 0 :(得分:1)

您的User课程需要使用DataContract属性及其DataMember属性的方法进行标记。它可能还需要在KnownType类中标记为CompositeUser,以便它包含在服务的类型中。你可以这样做:

[DataContract]
[KnownType(typeof(User))]
public class CompositeUser
{
...
}

您将能够从日志中分辨出问题所在。您要么会收到“无法序列化”的消息,在这种情况下,您需要添加[DataContract]属性,否则它将是“未预期的类型”,在这种情况下您还需要添加{{ 1}}属性

如果您在服务中启用跟踪,您将能够获得有关问题的更多详细信息。在配置文件中添加如下内容:

[KnownType]

还设置<configuration> <system.diagnostics> <trace autoflush="true"/> <sources> <source name="System.ServiceModel" switchValue="Verbose"> <listeners> <add name="sdt" type="System.Diagnostics.XmlWriterTraceListener" initializeData="D:\wcfLog.svcLog"/> </listeners> </source> </sources> </system.diagnostics> </configuration>

将允许在服务异常中返回有关错误的更多详细信息,这可能也有帮助。

修改

从下面的评论看来,<serviceDebug includeExceptionDetailInFaults="True" />类似乎是Linq to SQL生成的类。我认为你不应该通过网络发送这个课程。 WCF处理的消息不是带有行为的序列化类型,因此您应该创建一个DTO,它表示客户端需要的User类中的数据,并将此DTO从服务合同中发送出去。即使您按原样发送User类,当它到达客户端时,它也不会将上下文仍连接到DB。

答案 1 :(得分:0)

我今天再次遇到这个问题。很久以前我遇到了同样的问题,但是我忘记了原因,花了一些时间把它整理出来。

就我而言,这是一个循环的序列化问题。一个表有一列,它是同一个表中另一列的外键。所以我所要做的就是单击dbml文件的工作表面并将Serialization Mode更改为Unidirectional。

如果你的是Linq to Sql情况,并且错误信息如上所示,你可能想检查它是否与我的原因相同。