2013-06-12 4 views
0

I AME методы выполняющиеся на другом компьютере с помощью службы WCF здесь немного пример моего кода:Отправка объектов в WCF

вызов метода: return pipeProxy.SystemRequest(InstanceName, MethodName, Parameters);

Это метод и интерфейс:

[ServiceContract] 
    public interface IBlissRequest 
    { 
     [OperationContract] 
     object SystemRequest(string InstanceName, string MethodName, object[] Parameters); 
    } 

    public class BlissRequest : IBlissRequest 
    { 
     public object SystemRequest(string InstanceName, string MethodName, object[] Parameters) 
     { 
      return System21.BlissProcessingUnit.BPU.RequestFromIBC(InstanceName, MethodName, Parameters); ; 
     } 
    } 

, как вы можете видеть, я отправить 2 строку и массив объектов, и я получить объект назад, этот метод вызываются разными местами и объекты может быть Diferent, если я посылаю строки или целые числа с помощью этого метода все работает нормально, но когда я пытаюсь отправить List, все идет плохо, и метод не может выполнить. теперь я прочитал, что используется стандарт DataContractSerializer, и что мне нужно его преобразовать в XmlSerializer, чтобы заставить его работать. ive найдено http://msdn.microsoft.com/en-us/library/ms733901.aspx, но я не могу заставить мой пример работать. мог бы кто-нибудь указать мне в хорошем направлении.

Это исключение, которое брошено:

Был ошибка при попытке сериализовать параметр http://tempuri.org/:Parameters. Сообщение InnerException было «Тип» System.Collections.Generic.List`1 [[System.String, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] 'с именем контракта данных' ArrayOfstring: http://schemas.microsoft.com/2003/10/Serialization/Arrays ' неожиданно. Подумайте об использовании DataContractResolver или добавьте любые типы, не известные статически в список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, переданных DataContractSerializer. '. Дополнительную информацию см. В InnerException.

Внутреннее исключение:

{ "Тип 'System.Collections.Generic.List`1 [[System.String, mscorlib, Version = 4.0.0.0, культура = нейтральной, PublicKeyToken = b77a5c561934e089]]' с имя контракта с данными «ArrayOfstring: http://schemas.microsoft.com/2003/10/Serialization/Arrays» не ожидается. Рассмотрим использование DataContractResolver или добавьте любые типы, не известные статически в список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, переданных в DataContractSerializer. "}

Объект, который необходимо отправить: если возможно все, если не только все обычные вещи C#, такие как Lists

+0

вам нужно будет сериализовать свой список на клиенте, а затем десериализовать его на сервере – Jonesopolis

+0

@ Jonesy, но во время выполнения я не знаю, что посылается или принимается, поэтому я не знаю, когда это список или когда он строка – Jeffnl

+0

oh жаль, что я неправильно понял – Jonesopolis

ответ

-1

Вам не нужно добавлять типы коллекций к известным типам при полиморфном использовании вместо других коллекций или интерфейсов коллекции. Например, если вы объявляете член данных типа IEnumerable и используете его для отправки экземпляра ArrayList, вам не нужно добавлять ArrayList к известным типам.

Когда вы используете полиморфные коллекции вместо типов, не входящих в коллекцию, они должны быть добавлены к известным типам. Например, если вы объявляете элемент данных типа Object и используете его для отправки экземпляра ArrayList, добавьте ArrayList к известным типам.

Это не позволяет вам сериализовать любую эквивалентную коллекцию полиморфно. Например, когда вы добавляете ArrayList в список известных типов, это не позволяет вам назначать класс Array of Object, даже если он имеет эквивалентный контракт данных. Это ничем не отличается от обычного поведения известных типов при сериализации для типов, не связанных с коллекцией, но особенно важно понимать в случае коллекций, потому что для коллекций очень важен эквивалент.

Во время сериализации только один тип может быть известен в любой заданной области для данного контракта данных, а все эквивалентные коллекции имеют одинаковые контракты данных.Это означает, что в предыдущем примере вы не можете добавлять ArrayList и Array объекта к известным типам в той же области. Опять же, это эквивалентно поведению известных типов для не-коллекционных типов, но особенно важно понимать для коллекций. Известные типы могут также потребоваться для содержимого коллекций. Например, если ArrayList фактически содержит экземпляры Type1 и Type2, оба этих типа должны быть добавлены к известным типам.

Вы можете найти пример here под коллекциями и известными типами.

+0

Я не полностью понимаю ваше объяснение, я все еще новичок в этом углу C#. Это то, что я описываю, возможно или нет? не могли бы вы показать мне пример кода, который я опубликовал. – Jeffnl

Смежные вопросы