Ошибка неверного запроса 400 - клиент WCF - PullRequest
0 голосов
/ 22 октября 2009

На моем IIS работает веб-служба WCF. Он берет данные от клиента и вставляет в базу данных. Мой веб-сервис запрашивает объект со сложным типом данных Players. В Клиенте я создаю объект Players и передаю его Веб-службе для выполнения Работы.

В моем клиентском консольном приложении я делаю

string strBaseAddress = ConfigurationSettings.AppSettings["WEBSERVICE"];
Uri baseAddress = new Uri(strBaseAddress);
WebServiceHost host = new WebServiceHost(typeof(TrialCenterAPI), baseAddress);
host.open
// Doing Work
host.close

Это приложение работает нормально.

Теперь, когда я написал другого клиента, добавив ссылку на сервис для выполнения той же работы. Каждый раз мне выдаётся ошибка 400 Bad Request.

Я создал объект API Client, который был сгенерирован автоматически, затем вызвал соответствующий метод веб-сервиса и передал ему объект Players. Я попробовал поискать в Google, но у меня не было никакого решения. Я увеличил максимальный размер в Server, а также в Client Web Config.

Клиент Web Config использует пользовательскую привязку следующим образом:

<system.serviceModel>
      <bindings>
        <customBinding>
          <binding name="WebHttpBinding">
            <textMessageEncoding 
                 maxReadPoolSize="2147483647" 
                 maxWritePoolSize="2147483647"
                 messageVersion="None" writeEncoding="utf-8" >
              <readerQuotas maxDepth="2147483647" 
                     maxStringContentLength="2147483647" 
                     maxArrayLength="2147483647"
                     maxBytesPerRead="2147483647" 
                     maxNameTableCharCount="2147483647" />
            </textMessageEncoding>
            <httpTransport 
                 maxReceivedMessageSize="2147483647" 
                 maxBufferSize="2147483647"/>
          </binding>
        </customBinding>
      </bindings>
      <client>
          <endpoint name="WebHttpBinding"  
              address="Service Address/"
              binding="customBinding" 
              bindingConfiguration="WebHttpBinding"
              contract="TestClientAPI.API" />
      </client>
   </system.serviceModel>

Любая помощь будет высоко оценена.

Обновление:

Я нашел один поток в MSDN, который говорит

"Это ограничение самой модели веб-программирования. В отличие от конечных точек SOAP (т. Е. С конечными точками BasicHttpBinding, WSHttpBinding и т. Д.), Которые предоставляют способ предоставления метаданных о себе (WSDL или Mex) с информацией обо всех операциях параметров в конечной точке, в настоящее время нет стандартного способа предоставления метаданных для конечной точки не-SOAP - и это именно то, чем являются конечные точки на основе webHttpBinding. Короче говоря, тестовый клиент WCF не будет полезен для конечных точек на основе веб-интерфейса. некоторый стандарт для представления конечных точек веб-стиля появляется, когда WCF выпускает свою следующую версию, мы, вероятно, обновим тестовый клиент для его поддержки, но пока что нет ни одного широко принятого.

Одна из альтернатив, которую вы можете попробовать (хотя определенно не так просто / удобно), - создать тестовый клиент самостоятельно в коде, используя класс ChannelFactory (используя тот же контракт / привязку / поведение, который используется в службе (см. Пример ниже). затем можно использовать какой-либо сетевой инструмент захвата / воспроизведения, например Fiddler (www.fiddlertool.com), для отправки дополнительных запросов в службу. "

Ссылка: http://social.msdn.microsoft.com/forums/en-US/wcf/thread/deabd25b-a219-4e95-9826-d40dc2f75543

И я ищу решение именно этой проблемы. Я могу использовать сервис, используя класс ChannelFactory или Fiddler. Я не могу использовать Сервисный клиент. Я думаю, что в модели WCF пока нет прогресса в этом вопросе.

Еще одна вещь, которой у меня нет в файле web.config на сервере или app.config в клиенте. Я добавил это в Server Web.config, а затем получил другую ошибку: «Инициализатор типа для« System.ServiceModel.ClientBase`1 »вызвал исключение». Также я удалил настройки WebHttpBinding из конфигурации.

1 Ответ

4 голосов
/ 22 октября 2009

Прежде всего, webHttpBinding (в стиле REST) ​​не использует ни одну из этих настроек - они предназначены только для привязок на основе SOAP, таких как wsHttpBinding или basicHttpBinding.

Для привязок в стиле WCF REST необходимо убедиться, что IIS поддерживает большие передачи - по умолчанию максимальный размер сообщения IIS превышает значения по умолчанию.

Проверьте ваш web.config - у вас есть такая запись?

<system.web>
     ......
     <httpRuntime maxRequestLength="32678"/>  
     ......
</system.web>

Это ограничение в КБ - по умолчанию 4096 (4 МБ) - вам может потребоваться увеличить его до более высокого значения.

Если проблема связана не с размером сообщения, то, возможно, ваша служба вызывает исключение? Что именно ты делаешь? Загрузка или скачивание файлов или что-то?

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...