C# WCF Web 服务序列化错误



我在这里做错了什么? 我正在尝试创建一个访问不同 dll 项目的 WCF Web 服务。 返回是一个包含字符串和内皮的自定义列表。 调试时,我在简单地导航到 Service1.svc 时出现以下错误:

一个 ExceptionDetail,可能由 IncludeExceptionDetailInFaults=true 创建,其值为: System.InvalidOperationException:在调用 WSDL 导出扩展时引发异常:System.ServiceModel.Description contract: 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;
}
}
}

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

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

你能把你的复合类替换为:

[DataContract]
public class CompositeType
{
[DataMember]
public List<RoTools.RoAmCalls.CustomItem> myResults { get; set; }
}

相关内容

  • 没有找到相关文章

最新更新