gpt4 book ai didi

c# - 反序列化 SOAP 消息

转载 作者:行者123 更新时间:2023-11-30 15:08:14 28 4
gpt4 key购买 nike

我有一个外部供应商将 xml 发送给我进行测试

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<AVCabeza transactionID="000032" xmlns="http://webservices.patito/Core/">
<Solicitor entityID="WEST" systemType="WEB" />
</AVCabeza>
</soap:Header>
<soap:Body>
<Availability xmlns:a="http://webservices.patito/Availability/"
xmlns:hc="http://webservices.patito/Common/" summaryOnly="true"
xmlns="http://webservices.patito/og/Availability.wsdl">
<a:AvailabilityDetail availReqType="Room">
<a:Estadia>
<hc:StartDate>2009-01-05T00:00:00.0000000-05:00</hc:StartDate>
<hc:EndDate>2009-01-06T00:00:00.0000000-05:00</hc:EndDate>
</a:Estadia>
<a:HotelSearchCriteria>
<a:HotelRef chainCode="WC"/>
</a:HotelSearchCriteria>
</a:AvailabilityDetail>
</Availability>
</soap:Body>
</soap:Envelope>

我想要解串器所以我做到了

1) 我使用 xsd 生成 C# 类

2) 使用类生成创建一个新的项目类库。

结构

WebServicesExterns(项目) --> 服务(文件夹) ---> 所有类

例子

namespace WebServicesExterns.Services

<System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42"), _
System.SerializableAttribute(), _
System.Diagnostics.DebuggerStepThroughAttribute(), _
System.ComponentModel.DesignerCategoryAttribute("code"), _
System.Xml.Serialization.XmlTypeAttribute([Namespace]:="http://webservices.patito/Availability.wsdl")> _
Partial Public Class Availability




'''<comentarios/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42"), _
System.SerializableAttribute(), _
System.Diagnostics.DebuggerStepThroughAttribute(), _
System.ComponentModel.DesignerCategoryAttribute("code"), _
System.Xml.Serialization.XmlTypeAttribute([Namespace]:="http://webservices.patito/Core/"), _
System.Xml.Serialization.XmlRootAttribute([Namespace]:="http://webservices.patito/Core/", IsNullable:=false)> _
Partial Public Class AVCabeza

3)为try反序列化器创建测试类后

using WebServicesExterns.Services;
using System;
using System.Collections;
using System.IO;
using System.Linq;
using System.Runtime.Remoting;
using System.Runtime.Serialization;
using System.Xml;
using System.Xml.Serialization;
using NUnit.Framework;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Soap;


[Test()]
public void ShouldDeserializerSoapMessage()
{
var message = SoapToFromFile(@"C:\rq\Availability.xml");
Assert.IsNotNull(message);
}


public object SoapToFromFile(string filePath)
{
IFormatter formatter;
FileStream fileStream = null;
Object objectFromSoap = null;

try
{
fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
formatter = new SoapFormatter();
objectFromSoap = formatter.Deserialize(fileStream);
}
catch (Exception exception)
{
throw exception;
}
finally
{
if (fileStream != null) fileStream.Close();
}
return objectFromSoap;
}

所以,返回那个错误

解析错误,没有与 Xml 键“AVCabeza”“_P1”关联的程序集

调试我发现 _P1 等于“http://webservices.patito/Core/”

显然没有找到“类型”AVCabeza 类

怎么了?

新更新

看,那是供应商给我的

具有该结构的一个文件夹

root
|
-- WSDL_XSD
| |-XSD
| | files with extension .xsd
| |
| --WS
| files with extension .wsdl
|-- XMLSamples
|-files with xml extension that contain soap messsages

好吧,我删除了 xml(前面的例子)的头部

<?xml version="1.0" encoding="utf-8"?>
<Availability xmlns:a="http://webservices.patito/Availability/"
xmlns:hc="http://webservices.patito/Common/" summaryOnly="true"
xmlns="http://webservices.patito/og/Availability.wsdl">
<a:AvailabilityDetail availReqType="Room">
<a:Estadia>
<hc:StartDate>2009-01-05T00:00:00.0000000-05:00</hc:StartDate>
<hc:EndDate>2009-01-06T00:00:00.0000000-05:00</hc:EndDate>
</a:Estadia>
<a:HotelSearchCriteria>
<a:HotelRef chainCode="WC"/>
</a:HotelSearchCriteria>
</a:AvailabilityDetail>
</Availability>

并将尝试获取可反序列化的可用性对象,但未通过此标记

not expected "<Availability .."

现在在 wsdl_xsd -> ws -> ws 我看到可用性存在所以我认为什么可用性包装到 availabilitydetail(真实请求)这是我不能删除的对象可用性标签,因为它具有用于子标签的命名空间空间化

怎么想的?

也许如果我删除可用性并插入命名空间(以某种方式)我可以获得我的反序列化器对象

最佳答案

SoapFormatter 不是 XML 序列化程序。您应该使用 XmlSerializer 类。

此外,这是一个完整的 SOAP 消息。你最好让他们给你 WSDL 并使用“添加服务引用”。这将为您提供将为您执行序列化和反序列化的类。

关于c# - 反序列化 SOAP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5794206/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com