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)
谢谢.
我是否必须在此处使用 [attribute] 标头标记 Transaction 类?
不,您不必这样做,但建议您这样做。请参阅使用数据协定。
问题是您正在将派生对象传递到List<object>
.
您必须使用ServiceKnownType属性告诉服务要处理什么类型的对象:
[OperationContract]
[ServiceKnownType( typeof( MarketService.XXX ) )]
bool ProcessTransaction(SharedLibrary.Transaction transaction);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1766 次 |
最近记录: |