【问题标题】:WCF Creating endpoint based on xml dataWCF 基于 xml 数据创建端点
【发布时间】: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 服务,而不是创建我自己的客户端,并且它按我的预期工作。

标签: c# xml vb.net wcf


【解决方案1】:

可以参考下面的例子,成功反序列化xml:

Message m = Message.CreateMessage(XmlReader.Create("C:OrderItem.xml"), int.MaxValue, MessageVersion.Soap11);
SoapReflectionImporter importer = new SoapReflectionImporter(new SoapAttributeOverrides(), "xxx");
XmlTypeMapping mapp = importer.ImportTypeMapping(typeof(Class name));
XmlSerializer xmlSerializer = new XmlSerializer(mapp);
var o = (Class name)xmlSerializer.Deserialize(m.GetReaderAtBodyContents());

【讨论】:

    【解决方案2】:

    我没有创建自己的客户端,而是使用 SoapUI Open Source https://www.soapui.org/,它可以很好地测试我的 WCF 服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多