在WCF服务中标记引用的库类

Lee*_*Lee 5 c# dll service wcf

这跟我提出的上一个问题有关:

我有一个定义Transaction类的DLL.它由WCF服务库和客户端应用程序引用.我收到错误声明服务库无法托管,因为它无法序列化DLL类.

这是服务代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using ServerLibrary.MarketService;
using SharedLibrary; // This is the DLL in question

namespace ServerLibrary
{
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        string GetData(int value);

        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);

        [OperationContract]
        bool ProcessTransaction(SharedLibrary.Transaction transaction);
    }

    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";

        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }

        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我是否必须使用[attribute]标题在此处标记Transaction类?

[UPDATE]

这是我尝试托管此服务时收到的错误消息:

System.Runtime.Serialization.InvalidDataContractException:无法序列化"SharedLibrary.Transaction"类型.请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员.如果类型是集合,请考虑使用CollectionDataContractAttribute对其进行标记.有关其他受支持的类型,请参阅Microsoft .NET Framework文档.在System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException(字符串消息,类型类型)在System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(的Int32 ID,类型句柄的RuntimeTypeHandle,类型型)在System.Runtime.Serialization.DataContract. System.ServiceModel.Dispatcher.DataMontractSerializerOperationFormatter上System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.ValidateDataContractType(Type type)的System.Runtime.Serialization.XsdDataContractExporter.GetSchemaTypeName(Type type)中的DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id,RuntimeTypeHandle typeHandle,Type type). CreatePartInfo(MessagePartDescription部分,OperationFormatStyle风格,DataContractSerializerOperationBehavior serializerFactory)在System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.CreateMessageInfo(dataContractFormatAttribute dataContractFormatAttribute,MessageDescription米 essageDescription,DataContractSerializerOperationBehavior serializerFactory)在System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter..ctor(OperationDescription描述,DataContractFormatAttribute dataContractFormatAttribute,DataContractSerializerOperationBehavior serializerFactory)在System.ServiceModel.Description.DataContractSerializerOperationBehavior.GetFormatter(OperationDescription操作,布尔逻辑formatRequest,布尔逻辑formatReply,布尔isProxy)在System.ServiceModel.Description上System.ServiceModel.Description.DispatcherBuilder.BindOperations(ContractDescription合同,ClientRuntime代理,DispatchRuntime调度)的System.ServiceModel.Description.DataContractSerializerOperationBehavior.System.ServiceModel.Description.IOperationBehavior.ApplyDispatchBehavior(OperationDescription description,DispatchOperation dispatch) System.Service上的.DispatcherBuilder.InitializeServiceHost(ServiceDescription描述,ServiceHostBase serviceHost)Model.ServiceHostBase.InitializeRuntime()在System.ServiceModel.ServiceHostBase.OnBeginOpen()在System.ServiceModel.ServiceHostBase.OnOpen(时间跨度超时)在System.ServiceModel.Channels.CommunicationObject.Open(时间跨度超时)在System.ServiceModel.Channels. Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)中的CommunicationObject.Open()

这里要求的是包含Transaction的DLL:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SharedLibrary
{
    // Transaction class to encapsulate products and checkout data
    public class Transaction
    {
            public int checkoutID;
            public DateTime time;
            public List<object> products; // Using object to avoid MarketService reference, remember to cast back!
            public double totalPrice;
            public bool complete;

            public Transaction(int ID)
            {
                checkoutID = ID;
            }

            public void Start()
            {
                products = new List<object>();
                complete = false;
            }

            public void Complete()
            {
                time = DateTime.Now;
                complete = true;
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Nic*_*ler 1

我是否必须在此处使用 [attribute] 标头标记 Transaction 类?

不,您不必这样做,但建议您这样做。请参阅使用数据协定


问题是您正在将派生对象传递到List<object>.

您必须使用ServiceKnownType属性告诉服务要处理什么类型的对象:

[OperationContract]
[ServiceKnownType( typeof( MarketService.XXX ) )]
bool ProcessTransaction(SharedLibrary.Transaction transaction);
Run Code Online (Sandbox Code Playgroud)