Обработка перечислений WCF, когда клиент и сервер имеют разные версии перечисленияC#

Место общения программистов C#
Ответить
Anonymous
 Обработка перечислений WCF, когда клиент и сервер имеют разные версии перечисления

Сообщение Anonymous »

У нас много клиентов и услуг WCF. Все эти службы используют общий пакет данных, который включает в себя главную сборку, содержащую все перечисления, используемые в каждом контракте данных. Если в этом пакете данных есть изменения в любом из его перечислений, например добавление нового участника, не все службы необходимо обновлять, чтобы использовать это изменение с точки зрения бизнеса, поскольку оно не имеет отношения к его функции.
Однако, когда в это перечисление передается неизвестное значение, оно вызывает ошибку, поскольку отправляет строковое значение, которое не может быть сопоставлено с целым числом. В идеале мы хотели бы написать какой-нибудь форматировщик или поведение для перехвата значений перечисления и определения их допустимости. Если это действительно так, продолжайте вызов как обычно. Если оно недействительно, просто используйте целочисленное значение и игнорируйте строковое значение. Очевидно, что этот подход не будет работать в тех случаях, когда это перечисление необходимо по деловым причинам, но в большинстве случаев эти перечисления нужно просто передать через запрос.
Это можно сделать, добавив пользовательские заголовки, которые содержат как int, так и строковое значение перечисления, а затем обрабатывают его перед десериализацией, но мне не удалось заставить что-либо подобное работать правильно, и заголовки, похоже, не сохраняют необходимую мне информацию (но это может быть отдельная проблема; я пока не уверен).
Ниже приведен пример предыдущей попытки использования суррогата, взятый из этого, но ошибка, похоже, возникает до этого код, поэтому не работает должным образом.

Код: Выделить всё

/// 
/// Custom Data Contract Surrogate that De/Serializes enum values as their underlying values instead of strings (default WCF)
/// To avoid issues with newly introduced enum values on updated WCF services and older clients.
/// 
public class EnumValueDataContractSurrogate : IDataContractSurrogate
{
#region Interface Implementation

public Type GetDataContractType(Type type)
{
return type;
}

public object GetObjectToSerialize(object obj, Type targetType)
{
if(null == obj)
{
return obj;
}

if(targetType.IsNullable())
{
targetType = targetType.GetUnderlyingType();
}

if (targetType.IsEnum)
{
return EnumExtensions.ChangeToUnderlyingType(targetType, obj);
}

return obj;
}

public object GetDeserializedObject(object obj, Type targetType)
{
if ((false == targetType.IsEnum) || (null == obj))
{
return obj;
}

if (targetType.IsNullable())
{
targetType = targetType.GetUnderlyingType();
}

var stringObj = obj as string;
if (null != stringObj)
{
return Enum.Parse(targetType, stringObj);
}
return Enum.ToObject(targetType, obj);
}

public void GetKnownCustomDataTypes(Collection customDataTypes)
{
//not used
return;
}

public object GetCustomDataToExport(Type clrType, Type dataContractType)
{
//Not used
return null;
}

public object GetCustomDataToExport(MemberInfo memberInfo, Type dataContractType)
{
//not used
return null;
}

public Type GetReferencedTypeOnImport(string typeName, string typeNamespace, object customData)
{
//not used
return null;
}

public CodeTypeDeclaration ProcessImportedType(CodeTypeDeclaration typeDeclaration, CodeCompileUnit compileUnit)
{
//not used
return typeDeclaration;
}

#endregion
}
Возможно ли вообще то, что я пытаюсь сделать, игнорируя уродство решения? Я также написал MessageFormatter, но он тоже не заработал.

Подробнее здесь: https://stackoverflow.com/questions/782 ... ns-of-enum
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»