gpt4 book ai didi

.net - 在 .Net Web 服务中抛出 SoapException

转载 作者:行者123 更新时间:2023-12-01 02:24:44 27 4
gpt4 key购买 nike

编辑:我已经四处寻找答案,似乎没有人遇到类似的问题。在我看来,扔 SoapException应该根据需要格式化响应,而不仅仅是异常消息。感激地收到任何帮助。

我想返回一个 SoapException应该看起来像这样(示例):

HTTP/1.1 500 Internal Server Error.
Date: Wed, 26 May 2004 05:12:08 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 1.1.4322
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Content-Length: 488

<?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:Body>

<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>BlahBlahBlahBlahBlah</faultstring>
<detail />
</soap:Fault>

</soap:Body>
</soap:Envelope>

为此,我实现了这样的代码,取自 SoapException 的 MSDN 站点。 :
Imports System
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports System.Xml.Serialization
Imports System.Xml

<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class Service1
Inherits System.Web.Services.WebService

<WebMethod()>
Public Sub Process()
' Build the detail element of the SOAP fault.
Dim doc As New System.Xml.XmlDocument()
Dim node As System.Xml.XmlNode = doc.CreateNode(XmlNodeType.Element, _
SoapException.DetailElementName.Name, _
SoapException.DetailElementName.Namespace)

' Build specific details for the SoapException.
' Add first child of detail XML element.
Dim details As System.Xml.XmlNode = doc.CreateNode(XmlNodeType.Element, _
"mySpecialInfo1", "http://tempuri.org/")

' Add second child of detail XML element with an attribute.
Dim details2 As System.Xml.XmlNode = doc.CreateNode(XmlNodeType.Element, _
"mySpecialInfo2", "http://tempuri.org/")
Dim attr As XmlAttribute = doc.CreateAttribute("t", "attrName", _
"http://tempuri.org/")
attr.Value = "attrValue"
details2.Attributes.Append(attr)

' Append the two child elements to the detail node.
node.AppendChild(details)
node.AppendChild(details2)

'Throw the exception
Dim se As New SoapException("Fault occurred", SoapException.ClientFaultCode, _
Context.Request.Url.AbsoluteUri, node)
Throw se
Return
End Sub
End Class

但是,当我运行它时,发送的实际响应是:
HTTP/1.1 500 Internal Server Error
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 03 Jul 2013 13:06:26 GMT
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/plain; charset=utf-8
Content-Length: 233
Connection: Close

System.Web.Services.Protocols.SoapException: Fault occurred
at MyService.Service1.Process() in C:\MyLocation\MyService\Service1.asmx.vb:line 42

我如何获得格式如下的响应:
<soap:Envelope>
<soap:Body>
<soap:Fault>
<faultcode/>
<faultstring/>
<detail/>
</soap:Fault>
</soap:Body>
</soap:Envelope>

最佳答案

您的代码应该可以工作并按照 MSDN 示例为您提供格式化的错误,或者,如果您想要像您发布的响应示例一样的结果,那么像这样的服务应该可以解决问题:

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

<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class Service1
Inherits WebService

<WebMethod()>
Public Sub Process()
Dim detailsNode As XmlNode = Nothing
Dim actorString As String = Nothing
Throw New SoapException("BlahBlahBlahBlahBlah", SoapException.ServerFaultCode, actorString, detailsNode)
End Sub
End Class

这样的调用:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:Process/>
</soapenv:Body>
</soapenv:Envelope>

应该返回这个:
<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:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>BlahBlahBlahBlahBlah</faultstring>
<detail/>
</soap:Fault>
</soap:Body>
</soap:Envelope>

您还需要将此添加到您的 Web.config文件以删除故障字符串中的任何堆栈跟踪:
<configuration>
<system.web>
<customErrors mode="On" />
...
...
...

此外,通常不需要手动构建 SoapException,而是抛出更合适的异常并让 ASP.NET 将其包装在 SoapFault 中。详情请看这里: Using SOAP faults .

使用 SoapUI调用你的方法,你应该得到上面的结果。确保在 SOAP 端点上进行 POST,例如 http://localhost:8080/Service1.asmx 当您单击“调用”时,而不是在测试页面的 URL 上,例如 http://localhost:8080/Service1.asmx/Process 因为它不会返回 SOAP 格式的响应。

关于.net - 在 .Net Web 服务中抛出 SoapException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17449035/

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