c # Передача структуры в метод WCF - PullRequest
2 голосов
/ 07 апреля 2011

Я хочу передать класс клиенту через службу WCF. В этом классе я использую структуру. Но значение, которое я получаю на стороне клиента: «System.Data.DataSet» Должно быть что-то, чего я не понимаю. Смотрите мою структуру (пока это просто строка)

namespace spine.datatypes
{
[Serializable]
public struct Tanga : IXmlSerializable
{
    private string _value;


    public Tanga(string value)
    {
        this._value = value;
    }

    public static implicit operator Tanga(string value)
    {
        return new Tanga(value);
    }

    public override string ToString()
    {
        return this._value;
    }

    // implement IXmlSerializable
    public XmlSchema GetSchema() { return null; }
    public void ReadXml(XmlReader reader)
    {
        _value = reader.ReadContentAsString();
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteValue(this._value.ToString());
    }
}

}

Это мой сервис:

namespace webapplication.WCFservice.Recorder
{

    [ServiceContract]
    [XmlSerializerFormat]
    public interface IWCFRecorder
    {
        [OperationContract]
        TvRecorder getDedicatedJob(String recordername, String recorderip);
    }
}

И это класс, который я прохожу:

namespace spine.recorder.tv
{

[Serializable()]
[XmlRoot("Recorder")]
public class TvRecorder
{
    public int id { get; set; }
    public Tanga name { get; set; }
    public MyIpAddress ip { get; set; }
    public int channel { get; set; }
    public MyTimecode time_start { get; set; }
    public MyTimecode duration { get; set; }

    public TvRecorder() { }

    public TvRecorder(int _id, Tanga _name, MyIpAddress _ip, int _channel, MyTimecode _time_start, MyTimecode _duration)
    {
        this.id = _id;
        this.name = _name;
        this.ip = _ip;
        this.channel = _channel;
        this.time_start = _time_start;
        this.duration = _duration;
    }

}
}

1 Ответ

1 голос
/ 17 апреля 2011

К сожалению, существуют случаи, когда svcutil генерирует тип DataContract и тип XmlSerializer для одного и того же типа схемы. Я советую вам попробовать использовать дополнительные переключатели «/ serializer: XmlSerializer / useSerializerForFaults» на svcutil и посмотреть, решит ли это вашу проблему. Это должно гарантировать, что Танга генерируется.

Как правило, для импорта схемы для генерации типов DataContract все типы, определенные в схемах, должны содержаться в подмножестве XSD, поддерживаемом DCS, которое можно найти здесь:

http://msdn.microsoft.com/en-us/library/ms733112.aspx

Если svcutil не удается сгенерировать прокси-сервер при указании «/ serializer: DataContractSerializer», то наиболее вероятным объяснением является то, что схема не соответствует DC. Видите ли вы другие ошибки или предупреждения при использовании svcutil?

Также обычно плохая практика - использовать DataSets (как типизированные, так и нетипизированные) и IXmlSerializables в общедоступных веб-сервисах. В этом случае, кажется, могут быть трудности с их импортом. Вот быстрая ссылка по некоторым другим причинам, это может быть проблематично: http://www.hanselman.com/blog/PermaLink,guid,d88f7539-10d8-4697-8c6e-1badb08bb3f5.aspx

Хотя DataContractSerializer может сериализовать типы IXmlSerializable, вовсе не гарантируется, что типы IXmlSerializable могут быть импортированы как контракты данных. Это две разные концепции. Типы IXmlSerializable могут предоставлять свои собственные схемы, поэтому они могут предоставлять схемы, которые не совместимы с datacontract и, таким образом, приводят к тому, что svcutil возвращается к генерации типов XmlSerializer.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...