WCF DataContract не может быть повторно использован - PullRequest
0 голосов
/ 19 марта 2020

В моем решении есть три проекта: 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 ].


...