我正在创建2个wcf服务 - ADService和DBService . 我正在使用名为EmployeeDTO和CustomerDTO的DTO在 endpoints 之间交换数据 . 我无法将任何服务作为服务引用添加到我的解决方案中的其他项目,当我运行WCF主机并尝试访问ADService.svc或DBService.svc时,我得到以下内容:
Type 'DTOs.CustomerDTO' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. If the type is a collection, consider marking it with the CollectionDataContractAttribute.
和
Type 'DTOs.EmployeeDTO' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. If the type is a collection, consider marking it with the CollectionDataContractAttribute.
我的文件如下:
类CustomerDTO
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DTOs
{
public class CustomerDTO
{
public int customerID;
public string name;
public string surname;
public string street;
public string post_code;
public string city;
public string country;
public string personal_code;
public string phone_number;
public string group_type;
public string employee;
public CustomerDTO(int _customerID, string _name, string _surname, string _street, string _post_code, string _city, string _country, string _personal_code, string _phone_number, string _group_type, string _employee)
{
this.customerID = _customerID;
this.name = _name;
this.surname = _surname;
this.street = _street;
this.post_code = _post_code;
this.city = _city;
this.country = _country;
this.personal_code = _personal_code;
this.phone_number = _phone_number;
this.group_type = _group_type;
this.employee = _employee;
}
}
}
class EmployeeDTO:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DTOs
{
public class EmployeeDTO
{
public string givenName;
public string sn;
public string telephoneNumber;
public string sAMAccountName;
public string title;
public string Department;
public string distinguishedName;
public string OU;
public bool enable;
public EmployeeDTO(string _givenName, string _sn, string _telephoneNumber, string _sAMAccountName, string _title, string _Department, string _distinguishedName, string _OU, bool _enable)
{
this.Department = _Department;
this.distinguishedName = _distinguishedName;
this.givenName = _givenName;
this.sAMAccountName = _sAMAccountName;
this.sn = _sn;
this.telephoneNumber = _telephoneNumber;
this.title = _title;
this.OU = _OU;
this.enable = _enable;
}
}
}
Web.config文件
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="ki_dbEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="Data Source=WIN-D3T41W1E5EB\SQLEXPRESS;Initial Catalog=ki_db;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient"/>
</connectionStrings>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<services>
<service name="WcfHost.ADService">
<endpoint address="" binding="basicHttpBinding" contract="WcfHost.IADService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8733/WcfServiceLibrary/ADService/" />
</baseAddresses>
</host>
</service>
<service name="WcfHost.DBService">
<endpoint address="" binding="basicHttpBinding" contract="WcfHost.IDBService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8733/WcfServiceLibrary/DBService/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="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>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
To browse web app root directory during debugging, set the value below to true.
Set to false before deployment to avoid disclosing web app folder information.
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
IADService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using DTOs;
using System.Security.Principal;
namespace WcfHost
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IADService" in both code and config file together.
[ServiceContract]
public interface IADService
{
[OperationContract]
bool setConnection();
.
.
.
[OperationContract]
Task changeAccountStatus(EmployeeDTO _employee);
}
}
IDBService.cs是以类似方式定义的 .
我似乎无法找到这个错误的原因,特别是我的一个朋友有类似的实现,它的工作,而我的朋友没有 . 任何帮助将深表感谢 .
3 回答
要通过线路序列化类,您需要使用DataContract和DataMember属性对其进行标记(如上所述) . 我相信你还需要将这些字段转换为属性 . 所以你需要:
因为您的操作 Contract 使用EmployeeDTO类型作为输入参数,这意味着客户端需要能够创建该类型并通过线路将其发送到服务器 . 所以它必须归功于
[DataContract]
.当我尝试运行我的应用程序并在浏览器中显示WSDL时,我最近遇到了此错误 . 情况很奇怪,因为黄色WSDL错误页面标识的对象实际上是我的WCF服务 . 它让我挠头 .
最后,我已经将WCF服务类添加到ServiceKnownTypeAttribute,作为[ServiceKnownType(typeof(classname))]将错误的接口添加到了一个深夜...
因此,这是您可能收到此错误消息的另一个原因 .
干杯
正如它在错误消息中所述,将
DataContract
属性放在类的上方:您还需要将
DataMember
属性放在您希望通过该服务提供的任何属性上方,以及OperationContract
上方您想要提供的任何方法 .有关更多信息,请参阅本教程:http://www.wcftutorial.net/Data-Contract.aspx