#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>