如何在客户端接受 SoapException
本文关键字:端接 SoapException 客户端 客户 | 更新日期: 2023-09-27 18:35:05
我收到了可怕的"客户端发现响应内容类型为"text/html",但预期的"test/xml"错误,但经过一番谷歌搜索,我发现了这篇关于如何返回 SoapException 的文章。
所以我继续实施它,但现在我仍然遇到同样的错误。我是否需要在客户端进行更改才能接受 SoapException(我不这么认为,一切都只是从 Exception 继承而来,对吧?
为什么我仍然在客户端得到可怕的响应?
[WebMethod]
[SoapHeader("authenticationHeader")]
[WebServiceAuthentication(AuthenticationRequired = false)]
public DataSet GetConversionErrors()
{
try
{
return Components.PWD.GetConversionErrors();
}
catch (Exception ex)
{
PublishingManager.Publish(ex, HttpContext.Current.User.Identity.Name);
throw Components.SoapException.GenerateSoapException(ex, Context);
}
}
编辑:我知道这个捕获块中的异常正是我需要看到的,但我仍然在客户端获得System.InvalidOperationException。
编辑2:如果有帮助/重要,我正在通过网络参考(调用 *.asmx 文件)连接到网络服务。
Edit3:这是写入我们的异常日志服务器端的内容(在 PublishingManager.Publish() 调用中)。我的想法是,这应该是返回给客户的内容......
Exception Details:
Exception Type: System.Exception
Message: Test the text/html text/xml message.
Method: PWD.Components.PWD.GetConversionErrors
Username: xxxxxx Created 5/22/2012 4:20:53 PM
Application: xxxx Application Identity: NT AUTHORITY'IUSR
Source: xxxx Severity 2
Machine: xxxxxxxxx IP Address 127.0.0.1
AppDomain /LM/W3SVC/1/ROOT-1-129821937733610609
Stack Trace at PWD.Components.PWD.GetConversionErrors() in C:'Vault'Development-New'Web'Main_Logging'PWD'Components'PWD.cs:line 73
at PWD.PWD.GetConversionErrors() in C:'Vault'Development-New'Web'Main_Logging'PWD'PWD.asmx.cs:line 44
Additional Information:
+System.Exception:
Message: Test the text/html text/xml message.
Data: System.Collections.ListDictionaryInternal
InnerException:
TargetSite: System.Data.DataSet GetConversionErrors()
StackTrace: at PWD.Components.PWD.GetConversionErrors() in C:'Vault'Development-New'Web'Main_Logging'PWD'Components'PWD.cs:line 73
at PWD.PWD.GetConversionErrors() in C:'Vault'Development-New'Web'Main_Logging'PWD'PWD.asmx.cs:line 44
HelpLink:
Source: xxxx
UserName: xxxxxxx
TypeName: PublishingManager
MachineName: xxxxxxxxx
TimeStamp: 5/22/2012 4:20:54 PM
FullName: Services.Publishing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=null
AppDomainName: /LM/W3SVC/1/ROOT-1-129821937733610609
ThreadIdentity:
WindowsIdentity: NT AUTHORITY'IUSR
Severity: 2
MachineIPAddress: 127.0.0.1
Edit3:只是想抛出这个额外的代码块,以便人们看到我是如何测试这些异常的(也许这是错误的测试方式......在我的第一个代码块中,我在try块中调用了"返回Components.PWD.GetConversionErrors();",这是该方法:
public static DataSet GetConversionErrors()
{
DB db = new DB();
try
{
//return db.ExecuteDataset(Configuration.GenericConfig.AppConnectionString, CommandType.Text, spGetConversionErrors);
throw new Exception("Test the text/html text/xml message.");
}
catch
{
throw;
}
}
如您所见,我已经注释掉了实际的调用,并且只是扔进了我自己的行,每次都会出于测试目的抛出异常......
编辑4: @gbvb 这是新方法:
[WebMethod]
[SoapHeader("authenticationHeader")]
[WebServiceAuthentication(AuthenticationRequired = false)]
public DataSet GetConversionErrors()
{
try
{
return Components.PWD.GetConversionErrors();
}
catch (Exception ex)
{
//PublishingManager.Publish(ex, HttpContext.Current.User.Identity.Name);
//throw Components.SoapException.GenerateSoapException(ex, Context);
System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
System.Xml.XmlNode detailNode = xmlDoc.CreateNode(System.Xml.XmlNodeType.Element, System.Web.Services.Protocols.SoapException.DetailElementName.Name, System.Web.Services.Protocols.SoapException.DetailElementName.Namespace);
detailNode.InnerText = ex.ToString();
throw new System.Web.Services.Protocols.SoapException(ex.Message, System.Web.Services.Protocols.SoapException.ClientFaultCode, System.Web.HttpContext.Current.Request.Url.AbsoluteUri, detailNode, ex.InnerException);
}
}
编辑5:小提琴手2看到了什么:
HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Wed, 23 May 2012 19:25:56 GMT
Content-Length: 1208
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>500 - Internal server error.</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;}
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;}
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;}
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}
-->
</style>
</head>
<body>
<div id="header"><h1>Server Error</h1></div>
<div id="content">
<div class="content-container"><fieldset>
<h2>500 - Internal server error.</h2>
<h3>There is a problem with the resource you are looking for, and it cannot be displayed.</h3>
</fieldset></div>
</div>
</body>
</html>
如果有人知道如何很好地格式化此部分,请做:)
所以,我让它工作了。这是我发现的:
在IIS中查看我的网站属性,然后选择"模块"时,有一个名为"CustomErrorModule"的条目,它试图处理网站/Web服务引发的错误。
解决方法是删除该条目"自定义错误模块",或从以下位置更新我的配置文件:
<httpErrors errorMode="Custom" existingResponse="Replace">
自:
<httpErrors errorMode="Custom" existingResponse="Auto">
感谢大家的帮助,它引导我朝着正确的方向前进。(顺便说一句,我正在更新配置文件,所以我不必弄乱模块的东西)
另外,这里有一个解释这种情况的链接。
只是为了傻笑,你能尝试用 SoapException.ClientFaultCode 作为该调用的类型显式抛出新的 SoapException() 吗? 显然,您上面显示的代码中有几个层可能会失败,并且很容易搞砸(相信我,我知道:))。并且不要调用其他方法,例如 Publisher.publish.。这将指向是消息声明(即 ASMX 基础结构)还是您的代码弄乱了异常。