我在这里做错了什么?我正在尝试创建一个访问不同dll项目的WCF Web服务。返回是一个包含字符串和整数的自定义列表。调试时,只需导航到Service1.svc时出现以下错误:
ExceptionDetail,可能由IncludeExceptionDetailInFaults = true创建,其值为: System.InvalidOperationException:在对WSDL导出扩展的调用中抛出异常:System.ServiceModel.Description 合同:http://tempuri.org/:IService1 ----> System.Runtime.Serialization.InvalidDataContractException:键入' RoTools.RoAmCalls + CustomItem'无法序列化。考虑使用属性标记它,并标记要使用DataMemberAttribute属性序列化的所有成员。如果类型是集合,请考虑使用CollectionDataContractAttribute对其进行标记。有关其他受支持的类型,请参阅Microsoft .NET Framework文档
因此,在线研究错误我认为添加KnownType会有所帮助,但我仍然会遇到同样的错误。谢谢你的帮助。这是Service1.cs中的代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace RoWebService
{
[ServiceContract]
public interface IService1
{
[OperationContract]
List<RoTools.RoAmCalls.CustomItem> SingleProductCheck(string productId);
}
[KnownType(typeof(RoTools.RoAmCalls.CustomItem))]
[DataContract]
public class CompositeType
{
List<RoTools.RoAmCalls.CustomItem> myResults;
[DataMember]
public List<RoTools.RoAmCalls.CustomItem> myResults
{
get { return myResults; }
set { myResults = value; }
}
}
以下是Service1.svc.cs的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace RoWebService
{
public class Service1 : IService1
{
public List<RoTools.RoAmCalls.CustomItem> SingleProductCheck(string productId)
{
log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
var myReturn =
RoTools.RoAmCalls.GetPriceAndStatusSingleItem(productId, log, System.Configuration.ConfigurationManager.AppSettings["something1"],
System.Configuration.ConfigurationManager.AppSettings["something2"]);
return myReturn;
}
}
}
答案 0 :(得分:1)
WCF中使用的所有用户定义类型(在本例中为RoTools.RoAmCalls.CustomItem
)必须标有[DataContract]
属性。其成员必须标有[DataMember]
属性。
使用RoTools.RoAmCalls.CustomItem
属性标记[DataContract]
或考虑创建一个单独的类,该类将存储来自RoTools.RoAmCalls.CustomItem
的数据并将通过WCF传递。