Ошибка веб-службы WCF: «Привязка конечной точки службы не использует протокол HTTP»? - PullRequest
11 голосов
/ 15 марта 2011

У меня есть простой сервис WCF, который работал нормально, пока я тестировал на моей машине разработчика.

Теперь я переместил веб-службу на веб-сервер, и я запускаю службу (в режиме отладки) на http://mydomain.com:8005. При открытии веб-браузера по этому URL-адресу отображается ожидаемая страница службы, и если Я ставлю точку останова на сервере внутри интерфейса, который я вызываю, он достигает точки останова и возвращает ожидаемые данные ... но на стороне клиента он возвращается со следующей ошибкой:

Произошла ошибка при получении ответа HTTP на http://mydomain.com:8005/. Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP. Это также может быть связано с тем, что сервер прерывает контекст HTTP-запроса (возможно, из-за закрытия службы). Подробнее смотрите в журналах сервера.

Дополнительные сведения: подпись интерфейса:

IEnumerable<MyClass> GetThings(out string errMsg);

, где MyClass определяется как Сериализуемый, и определения идентичны для клиента и сервера.

Есть идеи, какие секретные переключатели мне нужно щелкнуть?

Ответы [ 8 ]

22 голосов
/ 15 марта 2011

WCF также должен иметь конкретные классы для передачи данных (поскольку все они должны быть XML-сериализуемыми и должны иметь возможность быть выраженными в XML-схеме - интерфейсы не очень хорошо подходят).

Я считаю, что он не сможет передать обратно IEnumerable<T> - попробуйте вместо этого использовать List<T> (или массив T[]) или конкретный тип.

Есть удача?

8 голосов
/ 09 февраля 2012

У меня была такая же проблема, потому что я возвращал с сервера безумно большое количество записей, я добавил следующую строку в мой файл конфигурации wcf, и она заработала.

<system.web>
    <httpRuntime maxRequestLength ="262144" executionTimeout="103600"/>
</system.web>
4 голосов
/ 15 марта 2011

Не определяйте MyClass как Сериализуемый. Отметьте его как [DataContract], а его свойства - как [DataMember].

Если вы не можете, ну ... Я думаю, что я видел этот вопрос и здесь.

EDIT

Хотя нет ничего, что по своей сути блокирует [Serializable], возможно, ваша сериализация будет обрабатывать больше, чем она может обработать.

РЕДАКТИРОВАТЬ 2

Комментарий marc_s понял все правильно

2 голосов
/ 02 июня 2014

Поздний ответ на вечеринку, но я получил ту же ошибку.

Оказывается, вы не можете использовать абстрактные классы для членов контракта данных. Я должен был использовать следующее:

[DataContract]
public class MyClass {
    [DataMember]
    public A MyProperty { get; set; }
}

[DataContract]
[KnownType(typeof(B))]
[KnownType(typeof(C))]
public class A {

}

[DataContract]
public class B : A {

}

[DataContract]
public class C : A {

}

Чтобы позволить WCF сериализовать что-то вроде

var myClass = new MyClass();
myClass.MyProperty = new B();
0 голосов
/ 14 октября 2016

Я столкнулся с той же проблемой.Это была проблема адреса порта EndpointAddress .В Visual Studio адрес порта вашего файла (например, Service1.svc) и адрес порта вашего проекта wcf должны совпадать с указанным в EndpointAddress .Позвольте мне подробно описать это решение.

Существует два шага для проверки адресов портов.

  1. В вашем проекте WCF щелкните правой кнопкой мыши файл службы (например, Service1)..svc) -> чем выбрать Просмотр в браузере Теперь в вашем браузере есть URL-адрес, подобный http://localhost:61122/Service1.svc, поэтому теперь запишите свой адрес порта как 61122

  2. Щелкните правой кнопкой мыши свой проект wcf -> затем выберите Свойства -> перейдите на Веб-вкладку -> Теперь в разделе Серверы -> выберите Используйте Visual Studio Development Server -> выберите Определенный порт и укажите адрес порта, который мы ранее нашли в нашей службе Service1.svc.То есть (61122) .

Ранее у меня был другой адрес порта.После правильного указания адреса порта, который я указал в EndpointAddress , моя проблема была решена.

Надеюсь, это может решить вашу проблему.

0 голосов
/ 31 мая 2016

Просто столкнулся с точно такой же проблемой, но это было вызвано типом протокола безопасности, жестко заданным на TLS 1.2, когда служба была развернута на сервере 2008 без R2 (и 32-разрядной для загрузки, что означает отсутствие возможности обновления до R2).

Это очень маловероятный сценарий для кого-то еще, но я подумал, что упомяну.

Если кто-то находится в такой же ситуации и имеет такую ​​строку кода, вы знаете, почему вы получаетеошибка сейчас:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
0 голосов
/ 15 апреля 2016

Я просто оставляю это здесь на всякий случай, если это кому-то нужно.Я сталкивался с той же ошибкой.Я вызывал свой сервис с аргументом типа Dictionary<int, string>, и для одной из пар ключ / значение было установлено строковое значение null.

Я изменил код, чтобы убедиться, что не было нулевых значений, иэто сработало

0 голосов
/ 07 августа 2013

Обновите вашу сущность, если какие-либо изменения были внесены в ваши предыдущие таблицы и не обновили вашу сущность, также будет возникать эта ошибка

...