gpt4 book ai didi

vb.net - .NET 网络服务。 (ASMX) 如何塑造请求和响应消息?

转载 作者:行者123 更新时间:2023-12-03 22:46:54 27 4
gpt4 key购买 nike

我正在构建一个网络服务来接受来自公司的通知。该公司通知我该服务的结构不正确,并为我提供了可用的网络服务的 .asmx。它看起来像这样:

请求:

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<AuthenticationInfo
xmlns="http://www.usps.com/postalone/services/UserAuthenticationSchema">
<UserId xmlns="">string</UserId>
<UserPassword xmlns="">string</UserPassword>
</AuthenticationInfo>
<fullServiceAddressCorrectionNotification
xmlns="http://www.usps.com/postalone/services/POCustomerMailXMLServices">string</fullServiceAddressCorrectionNotification>
</soap12:Body>
</soap12:Envelope>

回应:

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<FullServiceNixieDetailNotificationResponse
xmlns="http://idealliance.org/maildat/Specs/md091/mailxml70C/mailxml">
<FullServiceNixieDetailNotificationResult>string</FullServiceNixieDetailNotificationResult>
</FullServiceNixieDetailNotificationResponse>
</soap12:Body>
</soap12:Envelope>

我的看起来像这样:请求:

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<FullServiceNixieDetailNotification
xmlns="http://idealliance.org/maildat/Specs/md091/mailxml70C/mailxml">
<AuthenticationInfo>
<UserID>string</UserID>
<Password>string</Password>
</AuthenticationInfo>
<fullServiceAddressCorrectionNotification>string</fullServiceAddressCorrectionNotification>
</FullServiceNixieDetailNotification>
</soap12:Body>
</soap12:Envelope>

回应:

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<notificationResponse
xmlns="http://www.usps.com/postalone/services/POCustomerMailXMLServices">string</notificationResponse>
</soap12:Body>
</soap12:Envelope>

如您所见,我的东西被包裹在一个我需要删除的额外元素中。不幸的是,我不知道该怎么做。我的网络服务代码如下:

Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports System.Data.SqlClient

Public Structure AuthenticationInfoType
Dim UserID As String
Dim Password As String
End Structure

' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
' <System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://idealliance.org/maildat/Specs/md091/mailxml70C/mailxml")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class USPSMailXML
Inherits System.Web.Services.WebService

<WebMethod()> _
Public Function FullServiceNixieDetailNotification(ByVal AuthenticationInfo As AuthenticationInfoType, ByVal fullServiceAddressCorrectionNotification As String) As String

'Some code here

Return "MyResponse"

End Function

最佳答案

在讨论实际问题之前先介绍一些事情。

  1. 您应该做的第一件事就是摆脱 ASMX 并使用 WCF。如果您还不了解 WCF,您将有一个学习曲线。但我猜测 - 不要误解 - 您并不是真正的 ASMX 专家。如果是这样,请不要花时间成为 ASMX 专家,因为这已经是昨天的技术了;投入一些时间学习WCF。这对您、对您的公司都更好。

  2. 为了弄清楚术语,您显示的前两个片段既不是 ASMX,也不是 WSDL。它们是实际的线路级消息。

  3. 无论您选择何种实现技术,让我告诉您,您显示的示例传入和传出消息都非常奇怪。首先,它不符合 WSI BP1.0:传入的消息元素未包装在顶级元素中。为什么不?然而,响应消息包装在顶级元素中。为什么?这种不一致似乎是任意的。此外,元素名称均为 TitleCase,除了 fullServiceAddressCorrectionNotification(使用驼峰式命名法)之外。为什么?此外,传入消息是 USPS 命名空间,但参数使用 null 命名空间。啊?谁做的??这是合法的,但看起来vvvverrrry很奇怪。最后,响应上的 xml 命名空间与传入消息上的 xml 命名空间完全不同。 (我可以想象最后一个的充分理由)。我猜你不负责设计这些消息。但这些不一致给我带来了危险信号。这就是我所说的 jalopy 消息设计。


好吧,抛开所有这些......

有一种方法可以在 ASMX 中调整请求和响应,使用 SoapDocumentMethodAttribute ,以及 XmlElement 属性以及现有 WebMethod 属性的战略放置。 SoapDocumentMethodAttribute 使您可以访问旋钮和控制杆来指定传入和传出消息的元素名称和命名空间。

这应该会让你非常接近:

<%@
WebService
Language="VB"
Class="USPSMailXML"
%>

Imports System
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Xml.Serialization


Public Structure AuthenticationInfoType
<XmlElement(Namespace := "")> _
Dim UserID As String
<XmlElement(Namespace := "")> _
Dim Password As String
End Structure


Public Structure NixieResponse
<XmlElement("FullServiceNixieDetailNotificationResult")> _
Dim Message As String
End Structure


' Must not claim WSI compliance; there are multiple toplevel elements in the Request body
'
'<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<System.Web.Services.WebService(Namespace:="http://idealliance.org/maildat/Specs/md091/mailxml70C/mailxml"), _
System.Web.Services.WebServiceBinding(ConformsTo := WsiProfiles.None), _
ToolboxItem(False)> _
Public Class USPSMailXML
Inherits System.Web.Services.WebService

<WebMethod(), _
SoapDocumentMethod( _
Action := "", _
RequestElementName := "AuthenticationInfo", _
ResponseElementName := "FullServiceNixieDetailNotificationResponse", _
RequestNamespace := "http://www.usps.com/postalone/services/UserAuthenticationSchema", _
ResponseNamespace := "http://idealliance.org/maildat/Specs/md091/mailxml70C/mailxml", _
Use := System.Web.Services.Description.SoapBindingUse.Literal, _
ParameterStyle := System.Web.Services.Protocols.SoapParameterStyle.Bare)> _
Public Function FullServiceNixieDetailNotification(ByVal AuthenticationInfo As AuthenticationInfoType, _
<XmlElement(Namespace := "http://www.usps.com/postalone/services/POCustomerMailXMLServices")> _
ByVal fullServiceAddressCorrectionNotification As String) _
As <XmlElement("FullServiceNixieDetailNotificationResponse")> NixieResponse

Dim r As New NixieResponse
r.Message = "My Response"

Return r

End Function

End Class

我必须将其标记为 ParameterStyle = Bare,因为传入消息有 2 个顶级元素。这意味着传出的消息也是裸露的,在您的情况下这不是您想要的。因此,传出的消息只是一个字符串 - 我必须将其包装到一个结构中,以便获得您显示的形状。

我已经评论了传入和传出消息的设计。如果消息设计更加“理智”,那么其中一些扭曲就没有必要了。

关于vb.net - .NET 网络服务。 (ASMX) 如何塑造请求和响应消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1930791/

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