ASMX не выдает ошибки SOAP

#asp.net #web-services #soap

#asp.net #веб-сервисы #soap

Вопрос:

Мой ASP.NET 3.5 веб-служба (asmx) не выдает исключения как ошибки SOAP. Все, что я видел, говорит о том, что это поведение по умолчанию, но мое отправляет всю информацию об исключениях в виде текста / обычного. Это новый проект веб-приложения с добавлением одной службы. Никаких других изменений из-за готового поведения. Как мне получить ошибки SOAP?

Код:

 [WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class WebService : System.Web.Services.WebService
{
    [WebMethod]
    public string HelloWorld()
    {
        int test1 = 0;
        int test2 = 5 / test1;

        return "Hello World";
    }
}
 

Результат:

 HTTP/1.1 500 Internal Server Error
Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 25 Oct 2011 21:39:23 GMT
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/plain; charset=utf-8
Content-Length: 201
Connection: Close

System.DivideByZeroException: Attempted to divide by zero.
   at WebApplication.WebService.HelloWorld() in C:....cs:line 23
 

Ответ №1:

Веб-службы ASMX будут отвечать SOAP только в том случае, если запрос был SOAP. Страница тестирования, созданная для вас службой, не включает конверт запроса SOAP:

 POST http://server/service.asmx/HelloWorld HTTP/1.1
Accept: */*
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
Host: server
 

Правильный запрос SOAP выглядит следующим образом:

 POST http://server/service.asmx HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://server/HelloWorld"
Host: server
Content-Length: 283
Expect: 100-continue

<?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>
    <HelloWorld xmlns="http://server/" />
  </soap:Body>
</soap:Envelope>
 

Обратите внимание на поле заголовка SOAPAction и содержимое конверта SOAP. Если запрос является действительным запросом SOAP, служба ответит ответом SOAP. Для начального примера следующая ошибка SOAP является ответом:

 HTTP/1.1 500 Internal Server Error
Date: Sat, 05 Nov 2011 16:55:17 GMT
Content-Type: text/xml; charset=utf-8
Content-Length: 695

<?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>
        System.Web.Services.Protocols.SoapException: Server was unable to process request. ---    amp;> System.DivideByZeroException: Attempted to divide by zero.
        at Service.HelloWorld() in C:TestService.asmx.cs:line 35
        --- End of inner exception stack trace ---
      </faultstring>
      <detail />
    </soap:Fault>
  </soap:Body>
</soap:Envelope>