WCF Rest XML EndPoint。(HTTPPOST)。反序列化外部对象

时间:2015-08-03 05:19:19

标签: c# xml wcf

我有一个服务合约,它应该接受一个小部件作为输入参数。 小部件规范由第三方提供给我,该第三方将使用合同。 我制定了相应的数据合同,并且可以使用单元测试(使用WCF作为服务参考)来序列化窗口小部件并执行HTTP POST。

这是一个简单的XML序列化,嵌入在HTTPPOST的主体中。它不是一个格式良好的xml文档。 e.g。

 StringWriter sw = new StringWriter();
        XmlTextWriter xtw = new XmlTextWriter(sw);
        xtw.WriteStartElement("Widget");
        xtw.WriteElementString("DateTime", widget.DateTime);
        xtw.WriteStartElement("Status");
        foreach (MyServRef.Status status in widget.Status)
        {
            xtw.WriteStartElement("Status");
            xtw.WriteElementString("Bay", status.Bay.ToString());
            xtw.WriteElementString("CurrentState", status.CurrentState.ToString());
            xtw.WriteElementString("Sector", status.Sector.ToString());
            xtw.WriteElementString("SpaceId", status.SpaceId.ToString());
            xtw.WriteElementString("StatusId", status.StatusId.ToString());
            xtw.WriteElementString("TransitionDateTime", status.TransitionDateTime);
            xtw.WriteEndElement();
        }
        xtw.WriteEndElement();
        xtw.WriteElementString("UniqueId", message.UniqueId.ToString());
        xtw.WriteEndElement();
        xtw.Close();

        string xml = sw.ToString();

当第三方尝试使用合同时,会出现错误400.它们使用的是完全格式化的xml doc,其中包含名称空间声明。 例如

    <Widget xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    UniqueId="8cf4df0f-e765-4afc-b6fa-cd90b07b67b2"
    DateTime="2015-08-02T01:00:29.2213364Z" xmlns="http://www.thesite.com/">
      <Status>
        <SpaceId>00010003</SpaceId>
        <StatusId>1658038</StatusId>     
      </Status>
    </Widget>

合同是:

 [OperationContract]//Don't decorate XML REST Contracts use   web.config       
    Response MyContract(Widget widget);

数据合同是;

[DataContract(Namespace = "")]
public class Widget
{


    private string _uniqueIdField;

    private string _dateTimeField;



    [DataMember]

    public Status[] Status
    {
        get;
        set;

    }

    [DataMember]
    public string UniqueId
    {
        get { return _uniqueIdField; }
        set { _uniqueIdField = value; }
    }

    [DataMember]
    public string DateTime
    {
        get { return _dateTimeField; }
        set { _dateTimeField = value; }
    }
}

我尝试了很多选项,包括一个带有字符串参数的备用契约,然后使用DataContractSerializer来反序列化小部件。

基本上我不知道如何做到这一点,我正在四处寻找正确的方法。 我将不胜感激,可以帮助我解决这个问题。 感谢

1 个答案:

答案 0 :(得分:0)

如果您可以创建一个.net winform应用程序并引用您的服务吗?如果可行,您应该能够查看请求,以了解您的winform应用程序与第三方请求之间的区别。