在解决方案中,我添加了“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”类中的一些东西,为什么我要做这个循环。欢迎解决方案。
答案 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情况,并且错误信息如上所示,你可能想检查它是否与我的原因相同。