Сервис wcf Внутренняя ошибка сервера - PullRequest
3 голосов
/ 06 августа 2011

Я создал простой сервис wcf, который предоставляет метод GetData. На самом деле это шаблон, созданный при создании нового проекта wcf.

Я добавил приложение на сервер iis, чтобы к нему можно было получить доступ извне, например: http://192.168.0.100/TFSWrapper/Service1.svc

Я использовал универсальный мыльный клиент для отправки запроса в метод GetData. Это сгенерированный запрос мыла:

<?xml version="1.0" encoding="utf-16"?>
<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>
    <GetData xmlns="http://tempuri.org/" />
  </soap:Body>
</soap:Envelope>

Вот мыльный ответ:

<?xml version="1.0" encoding="utf-16"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <GetDataResponse xmlns="http://tempuri.org/">
      <GetDataResult>You entered: 87</GetDataResult>
    </GetDataResponse>
  </s:Body>
</s:Envelope>

Кстати, я удалил параметр из метода и жестко закодировал возвращаемое значение.

Как видите, все работает как надо.

Затем я создал клиент Titanium, который вызывает ту же службу. Я использовал точный запрос на мыло, как указано выше, просто чтобы убедиться.

В основном я сделал это:

var s='<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><GetData xmlns="http://tempuri.org/" /></soap:Body></soap:Envelope>';
        //xhr.send(config.envelopeBegin+body+config.envelopeEnd);
        xhr.send(s);

Когда это отправлено, сервер возвращает ответ «500 внутренняя ошибка сервера» вместе со следующей строкой ошибки:

Сообщение с действием 'http://tempuri.org/GetData' не может быть обработано в получателе, из-за несоответствия ContractFilter в EndpointDispatcher. Это может быть из-за несоответствия контракта (несоответствующие действия между отправителем и получателем) или привязка / безопасность несоответствие между отправителем и получателем. Проверьте отправителя и получатель имеют одинаковый договор и одинаковую привязку требования безопасности, например Сообщение, Транспорт, Нет).

Сначала я использовал API титанового мыла для создания XML-запроса, но я получал ту же ошибку. Я думал, что это проблема с тем, как это создается, поэтому я жестко запрограммировал запрос (это работает), но все равно не повезло.

1 Ответ

2 голосов
/ 11 августа 2011

По умолчанию WCF Service OperationContracts может быть вызван только с помощью HTTP POST.Когда вы вызываете open () для Titanium HTTPClient, указываете ли вы параметр метода GET или POST для HTTP?

Во-вторых, поскольку привязка вашего сервиса использует SOAP 1.1, вам нужно передать заголовок SOAPAction в вашем запросетак что WCF может направить сообщение в метод GetData.Если параметр Action не указан в атрибуте OperationContract службы, Action должен быть именем метода, которому предшествуют пространство имен и имя контракта службы (вероятно, http://tempuri.org/IService1/GetData, если вы используете то, что было создано приложением WCF по умолчанию).Вам также необходимо указать тип контента.Таким образом, вам нужно настроить xhr следующим образом перед вызовом send:

xhr.setRequestHeader('Content-Type', 'text/xml; charset=utf-16');
xhr.setRequestHeader('SOAPAction', '"http://tempuri.org/IService1/GetData"');
xhr.send(s);

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

[OperationContract(Action = "MyAction")]
string GetData()
{
    // ...snip...
}

xhr.setRequestHeader('SOAPAction', '"MyAction"');

Инаконец, вы можете разрешить запуск сервисных операций через HTTP GET, украшая метод с помощью атрибута [WebGet].Это позволяет вызывать операцию в режиме REST: http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webgetattribute.aspx

...