c#WCF Web服务序列化错误

时间:2017-05-12 15:18:45

标签: c# .net web-services wcf serialization

我在这里做错了什么?我正在尝试创建一个访问不同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;
    }
}
}

1 个答案:

答案 0 :(得分:1)

WCF中使用的所有用户定义类型(在本例中为RoTools.RoAmCalls.CustomItem)必须标有[DataContract]属性。其成员必须标有[DataMember]属性。

使用RoTools.RoAmCalls.CustomItem属性标记[DataContract]或考虑创建一个单独的类,该类将存储来自RoTools.RoAmCalls.CustomItem的数据并将通过WCF传递。