Как принять SoapException на стороне клиента

Я получал страшный "клиент обнаружил тип содержимого ответа"text/html", но ожидал ошибку" test / xml ", но после некоторого поиска в Google я нашел этот пост о том, как вернуть исключение 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 на стороне клиента.

Edit2: я подключаюсь к веб-сервисам через WebReference (вызывая файл *.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;
        }
    }

Как вы можете видеть, я закомментировал реальный вызов и просто добавил свою собственную строку, которая будет вызывать исключение каждый раз для целей тестирования...

Edit4: @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);
        }
    }

Edit5: Что видел Fiddler2:

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>

Если кто-нибудь знает, как правильно отформатировать этот раздел, пожалуйста, сделайте:)

2 ответа

Решение

Итак, я получил его на работу. Вот что я узнал:

При просмотре свойств моего веб-сайта в IIS и выборе "Модули" появляется запись "CustomErrorModule", которая пытается обработать ошибки, которые выдает веб-сайт / веб-служба.

Исправление заключается в том, чтобы либо удалить эту запись "CustomErrorModule", либо обновить мой файл конфигурации из:

<httpErrors errorMode="Custom" existingResponse="Replace">

чтобы:

<httpErrors errorMode="Custom" existingResponse="Auto">

Спасибо всем за помощь, это направило меня в правильном направлении. (Кстати, я обновляю файл конфигурации, чтобы мне не приходилось связываться с модулем)

Также вот ссылка, объясняющая эту ситуацию.

Просто для смеха, можете ли вы попробовать явно выдать новый SoapException() с SoapException.ClientFaultCode в качестве типа из этого вызова? очевидно, у вас есть несколько слоев, которые могут не работать в коде, который вы показываете выше, и это легко испортить (поверьте, я знаю:)). И не вызывайте другие методы, такие как Publisher.publish.., которые будут указывать, является ли это объявлением сообщения (то есть инфраструктурой ASMX), или это ваш код, который работает с исключением...

Другие вопросы по тегам