2012-05-22 2 views
1

Я получал страшный «клиентский тип содержимого ответа« text/html », но ожидал ошибку« test/xml », но после некоторого поиска в Google я нашел this post о том, как вернуть SoapException.Как принять исключение 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); 
     } 
    } 

Редактировать: Я знаю, что исключение в этом блоке catch является именно тем, что мне нужно увидеть, но я все еще получаю исключение System.InvalidOperationException на стороне клиента.

Редактировать 2: Я подключаюсь к веб-службам через WebReference (вызывая файл * .asmx), если это помогает/имеет значение.

Редактировать 3: Вот что написано на нашей стороне сервера исключений (в вызове 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: Просто хочу, чтобы бросить этот дополнительный код кусок так люди видят, как я проверяю эти исключения (и, возможно, это неправильный путь тестировать...). В моем первом фрагменте кода, у меня есть вызов внутри блока пытаются «вернуть 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> 

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

+1

«Итак, я пошел вперед и реализовал это, но теперь я все еще получаю ту же ошибку». Я слышал это и говорил это раньше. Вы уверены, что полностью * внедрили * свои изменения и развернули их в среду, в которой вы тестируете? –

+1

Кроме того, очень важно знать, какая версия .NET вы используете. –

+0

Я верю, что я запускаю веб-службы на своем «localhost» и просто звоню. Я могу настроить точки останова как на стороне сервера, так и на стороне клиента ... но когда он останавливается на стороне клиента, фактическое исключение, возвращаемое с сервера, является InvalidOperationException вместо SoapException. – ganders

ответ

1

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

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

Исправление либо удалить эту запись «CustomErrorModule», или обновить файл конфигурации из:

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

к:

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

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

Также here's a link объясняя эту ситуацию.

+0

Поздравления – gbvb

0

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

+0

Я попробую те сразу ... Я также попытаюсь просто выбросить регулярное исключение вместо SoapException. – ganders

+0

проверить edit4, чтобы убедиться, что я делаю это так, как вы предположили ... – ganders

+0

Редактирование кода кажется правильным, и вы все еще видите ту же проблему? – gbvb

Смежные вопросы