我是 WCF 的新手,并创建了一个简单的 REST 服务来接受一个订单对象(来自 XML 文件的一系列字符串),将该数据插入数据库,然后返回一个包含结果的订单对象。为了测试该服务,我创建了一个小型 Web 项目并通过从 xml 文档创建的流发送。
问题是,即使 xml 文档中的所有项目都放入了流中,服务在接收数据时也会取消其中的一些项目。例如 lineItemId 将有一个值,但发货状态将显示为 null。我逐步完成 xml 创建并验证是否正在发送所有值。但是,如果我清除数据成员并更改名称,它可以工作。任何帮助,将不胜感激。
这是接口代码
[ServiceContract(Namespace="http://companyname.com/wms/")]
public interface IShipping
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/Orders/UpdateOrderStatus/", BodyStyle=WebMessageBodyStyle.Bare)]
ReturnOrder UpdateOrderStatus(Order order);
}
[DataContract(Namespace="http://companyname.com/wms/order")]
public class Order
{
[DataMember]
public string lineItemId { get; set; }
[DataMember]
public string shipmentStatus { get; set; }
[DataMember]
public string trackingNumber { get; set; }
[DataMember]
public string shipmentDate { get; set; }
[DataMember]
public string delvryMethod { get; set; }
[DataMember]
public string shipmentCarrier { get; set; }
}
[DataContract]
public class ReturnOrder
{
[DataMember(Name = "Result")]
public string Result { get; set; }
}
这是我用来发送 Order 对象的内容:
string lineId = txtLineItem.Text.Trim();
string status = txtDeliveryStatus.Text.Trim();
string TrackingNumber = "1x22-z4r32";
string theMethod = "Ground";
string carrier = "UPS";
string ShipmentDate = "04/27/2010";
XNamespace nsOrders = "http://tempuri.org/order";
XElement myDoc =
new XElement(nsOrders + "Order",
new XElement(nsOrders + "lineItemId", lineId),
new XElement(nsOrders + "shipmentStatus", status),
new XElement(nsOrders + "trackingNumber", TrackingNumber),
new XElement(nsOrders + "delvryMethod", theMethod),
new XElement(nsOrders + "shipmentCarrier", carrier),
new XElement(nsOrders + "shipmentDate", ShipmentDate)
);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:3587/Deposco.svc/wms/Orders/UpdateOrderStatus/");
request.Method = "POST";
request.ContentType = "application/xml";
try
{
request.ContentLength = myDoc.ToString().Length;
StreamWriter sw = new StreamWriter(request.GetRequestStream());
sw.Write(myDoc);
sw.Close();
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
StreamReader reader = new StreamReader(response.GetResponseStream());
string responseString = reader.ReadToEnd();
XDocument.Parse(responseString).Save(@"c:\DeposcoSvcWCF.xml");
}
}
catch (WebException wEx)
{
Stream errorStream = ((HttpWebResponse)wEx.Response).GetResponseStream();
string errorMsg = new StreamReader(errorStream).ReadToEnd();
}
来自 Web.Config 的绑定
<system.serviceModel>
<services>
<service behaviorConfiguration="DesposcoService.ShippingServiceBehavior" name="DesposcoService.ShippingService">
<endpoint address="wms" binding="webHttpBinding" contract="DesposcoService.IShipping" behaviorConfiguration="REST" bindingNamespace="http://companyname.com/wms">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DesposcoService.ShippingServiceBehavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="REST">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>