【发布时间】:2022-10-25 05:49:57
【问题描述】:
我被要求创建一个 WCF Web 服务端点,它将从 xml 文件中获取数据作为传递给它的参数。
我尝试创建一个基于虚拟 xml 文件的简单 WCF Web 服务
我在下面创建的 Web 服务位于 VB.NET 和 .NET Framework 4.6 中,并且我在 Web 服务代码底部的 OrderedItem 代码中生成了 xml 架构,它作为参数传递给 PushOrderItem OperationContract,这就是客户想要的。
<ServiceContract()>
Public Interface IService
<OperationContract()>
Function PushOrderItem(ByVal data As OrderedItem) As String
End Interface
Imports System.Xml.Serialization
Public Class Service
Implements IService
Public Sub New()
End Sub
Function PushOrderItem(ByVal data As OrderedItem) As String Implements IService.PushOrderItem
Return "TEST"
End Function
End Class
<XmlRoot(ElementName:="OrderedItem")>
Public Class OrderedItem
<XmlElement(ElementName:="ItemName", [Namespace]:="http://www.cpandl.com")>
Public Property ItemName As String
<XmlElement(ElementName:="Description", [Namespace]:="http://www.cpandl.com")>
Public Property Description As String
<XmlElement(ElementName:="UnitPrice", [Namespace]:="http://www.cohowinery.com")>
Public Property UnitPrice As String
<XmlElement(ElementName:="Quantity", [Namespace]:="http://www.cpandl.com")>
Public Property Quantity As String
<XmlElement(ElementName:="LineTotal", [Namespace]:="http://www.cohowinery.com")>
Public Property LineTotal As String
<XmlAttribute(AttributeName:="inventory", [Namespace]:="http://www.w3.org/2000/xmlns/")>
Public Property Inventory As String
<XmlAttribute(AttributeName:="money", [Namespace]:="http://www.w3.org/2000/xmlns/")>
Public Property Money As String
End Class
我遇到的问题是,当我创建一个 WCF 客户端来尝试使用新的端点时,它似乎没有像我预期的那样工作。
下面是我创建的控制台应用程序的代码,它读取 xml 文件(上面添加的内容)并将其反序列化为 ServiceReference1.OrderedItem 但 ServiceReference1.OrderedItem 的请求实例只包含所有空值?
ServiceReference1.ServiceClient client = new ServiceReference1.ServiceClient();
var reader = new System.Xml.Serialization.XmlSerializer(typeof(ServiceReference1.OrderedItem));
var file = new System.IO.StreamReader(@"C:\OrderItem.xml");
ServiceReference1.OrderedItem request = (ServiceReference1.OrderedItem)reader.Deserialize(file);
var response = client.PushOrderItem(request);
谁能让我知道我在这里做错了什么?
【问题讨论】:
-
我没有看到任何明显的东西。我通常使用而不是 StreamReader : System.Xml.XmlReader.Create(@"C:\OrderItem.xml");我对您的 c# 和 VB.Net 组合感到困惑。反序列化是 c#,而类是 VB.Net。我会将类更改为 c#。
-
@jdweng 感谢您的评论。我知道你对 VB.NET 到 C# 的意思。我在一家使用 VB.NET 的公司工作,因此 API 是这样编写的,但我更喜欢 C#;因此客户端以这种方式编写,但客户端可以用另一种完全不同的语言编写,因为它的工作只是使用 SOAP 端点。
-
如果你得到空值而不是构造函数 New() 被调用,但你永远不会得到反序列化数据的方法。
-
@jdweng我认为问题基本上是虽然我基于Xml文档创建了Web服务,但服务引用的代理类的生成,即客户端上的ServiceReference1.OrderedItem没有考虑到服务器上的对象OrderedItem 基于 Xml 文档。不过感谢您的回复。我已经能够通过 SoapUI 将数据发送到我的 Web 服务,而不是创建我自己的客户端,并且它按我的预期工作。