В моем решении есть три проекта: 1. «Общий» проект содержит общие DataContract
s; 2. Проект "DbService" является приложением WCF Service; 3. Проект «DatabaseServiceLibrary» - это клиент, который использует «DbService». У меня есть два DataContract
в проекте Common, SqlParameters
и SerializableSqlDbType
. Я установил флажок «Повторное использование типов во всех ссылочных сборках», когда использовал Visual Studio для «Добавить ссылку на службу ...» в проект DatabaseServiceLibrary. Однако SqlParameters
по-прежнему генерируется в прокси-коде проекта DatabaseServiceLibrary, а KnownTypeAttribute
, присутствующие в исходном SqlParameters
проекте Common, не отображаются на SqlParameters
в прокси-коде, что приводит к System.Runtime. Serialization.SerializationException при использовании сервиса:
Тип 'xxx' с именем контракта данных 'xxx' не ожидается. Попробуйте использовать DataContractResolver или добавить любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, передаваемых в DataContractSerializer.
Здесь мои коды:
namespace Common
{
[CollectionDataContract(Name = "SqlParameters", Namespace = "http://schemas.datacontract.org/2004/07/Common",
ItemName = "SqlParameterItem", KeyName = "Key", ValueName = "Value")]
[KnownType(typeof(SqlDbType))]
[KnownType(typeof(SerializableSqlDbType))]
public class SqlParameters : Dictionary<string, object>
{
}
}
namespace DbService
{
[ServiceContract]
[ServiceKnownType(typeof(SqlDbType))]
[ServiceKnownType(typeof(SerializableSqlDbType))]
[ServiceKnownType(typeof(SqlParameters))]
public interface IDbService
{
[OperationContract]
[FaultContract(typeof(ConnectionStringNotDefinedFault))]
DataTable Retrieve(string connectionStringName, string sql, SqlParameters parameters);
[OperationContract]
[FaultContract(typeof(ConnectionStringNotDefinedFault))]
DataTable CreateUpdateDelete(string connectionStringName, DataTable changes);
[OperationContract]
[FaultContract(typeof(ConnectionStringNotDefinedFault))]
DataSet ExecuteStoredProcedure(string connectionStringName, string spName,
ref SqlParameters parameters);
[OperationContract]
SerializableSqlDbType Test(SerializableSqlDbType type);
}
}
SerializableSqlDbType
является копией перечисления System.Data.SqlDbType
, единственное отличие состоит в том, что SerializableSqlDbType
помечен как [DataContract], а его значения помечены как [EnumMember ].