簡體   English   中英

c#在WCF方法中傳遞結構

[英]c# Passing a struct in a WCF method

我想通過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;
    }

}
}

不幸的是,svcutil會為同一模式類型生成DataContract類型和XmlSerializer類型。 我建議您嘗試使用附加的“ / serializer:XmlSerializer / useSerializerForFaults”開關切換到svcutil,看看是否可以解決您的問題。 它應該確保生成Tanga。

通常,為了使架構導入生成DataContract類型,架構中定義的所有類型必須包含在DCS支持的XSD子集中,您可以在這里找到:

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

如果在指定“ / serializer:DataContractSerializer”時svcutil無法生成代理,則最可能的解釋是該架構不符合DC標准。 使用svcutil時,是否還看到其他錯誤或警告?

在公共Web服務中使用數據集(類型化和非類型化)和IXmlSerializables通常也是一種不好的做法。 在這種情況下,似乎很難導入這些文件。 這是一個由於其他原因而可能導致問題的快速鏈接: http : //www.hanselman.com/blog/PermaLink,guid,d88f7539-10d8-4697-8c6e-1badb08bb3f5.aspx

盡管DataContractSerializer可以序列化IXmlSerializable類型,但完全不能保證IXmlSerializable類型可以作為數據協定導入。 那是兩個不同的概念。 IXmlSerializable類型可以自由提供自己的模式,因此它們有可能提供不符合數據合同的模式,從而導致svcutil退回到XmlSerializer類型生成。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM