我有一个服务合约,它应该接受一个小部件作为输入参数。 小部件规范由第三方提供给我,该第三方将使用合同。 我制定了相应的数据合同,并且可以使用单元测试(使用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来反序列化小部件。
基本上我不知道如何做到这一点,我正在四处寻找正确的方法。 我将不胜感激,可以帮助我解决这个问题。 感谢
答案 0 :(得分:0)
如果您可以创建一个.net winform应用程序并引用您的服务吗?如果可行,您应该能够查看请求,以了解您的winform应用程序与第三方请求之间的区别。