Контракты данных WCF с использованием класса из внешней сборки - PullRequest
0 голосов
/ 15 февраля 2019
using System.IO;
using System.Runtime.Serialization;
using System.Xml;
using MR.Storage.CommonClasses;

namespace Storage.Contract
{

[DataContract]
public class SaveMyData
{

    [DataMember]
    public MR.Storage.CommonClasses.MyData MyData{ get; set; }
}

Выше мой класс контракта данных для моей службы wcf.MyData - это класс poco во внешней сборке, который украшен атрибутами [DataContract] и [DataMember].Когда я добавляю ссылку на сервис в решение, я получаю «Метаданные содержат ссылку, которая не может быть разрешена».Я также попытался добавить его в тестовый клиент wcf, и он выдает ошибку ... \ Test Client Projects \ 14.0 \ 729f94f0-f564-4439-90f9-1c1553821666 \ Client.cs (42,26): ошибка CS0234: тип или имя пространства имен«MyData» не существует в пространстве имен «MR.Storage.CommonClasses» (у вас отсутствует ссылка на сборку?) Я открыл этот файл, и единственным оператором using является использование System.Runtime.Serialization;Что я делаю не возможно?Я видел некоторые другие предложения по использованию суррогата, но MyData имеет массу полей, поэтому очень хотел бы найти решение, которое не включает отображение каждого свойства

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Если вы не обязательно используете DataContractSerializer, вы можете рассмотреть возможность использования XmlSerializer для сериализации ваших данных, ему не нужно использовать атрибуты DataContract и DataMember.

namespace ServiceInterface.Models
{
public class MyData
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

public  class MyDataFather
{
    public MyData MyData { get; set; }
}
}

Мой сервисный контракт и сервис.Пожалуйста, не забудьте добавить атрибут XmlSerializerFormat к контракту на обслуживание, он говорит wcf использовать XmlSerializer

[ServiceContract]
[XmlSerializerFormat]
public interface ICotractWithoutAttribute
{
    [OperationContract]
MyDataFather GetData(MyDataFather myDataFather);
}

public class CotractWithoutAttribute : ICotractWithoutAttribute
{
    public MyDataFather GetData(MyDataFather myDataFather)
    {
        return myDataFather;
    }
}

Результат.

enter image description here

Мой клиент.

using (ChannelFactory<ICotractWithoutAttribute> factory = new ChannelFactory<ICotractWithoutAttribute>("without"))
        {
            ICotractWithoutAttribute cotractWithoutAttribute = factory.CreateChannel();
            ServiceInterface.Models.MyDataFather myDataFather = cotractWithoutAttribute.GetData(new ServiceInterface.Models.MyDataFather { MyData = new ServiceInterface.Models.MyData { Name = "MICK", Age = 18, Id = 1 } });
        }

Для получения дополнительной информации о XmlSerializer вы можете обратиться к https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-the-xmlserializer-class

Если вы должны использовать DataContractSerializer, я думаю, вы должны определить класс с аналогичной структуройс внешним классом добавьте DataContarct и DataMember в класс и скопируйте данные своего внешнего класса в свой собственный класс в вашей службе.

https://social.msdn.microsoft.com/Forums/vstudio/en-US/51b9d122-7345-44c7-8cd8-eb0ccdbffabf/can-i-use-external-assembly-class-in-a-wcf-without-using-poco?forum=wcf

0 голосов
/ 15 февраля 2019

Вы редактировали справочные свойства службы WCF?Вы можете сослаться на внешние сборки таким образом.Честно говоря, я обнаружил, что такой подход - боль в заднице (проблемы с версией версии), но YMMV.

Wcf Service Properties

...