Ошибка веб-службы WCF: "привязка конечной точки службы, не использующая протокол HTTP"?

У меня есть простая служба WCF, которая отлично работает, когда я тестировал свою dev-машину.

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

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

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

IEnumerable<MyClass> GetThings(out string errMsg);

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

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

Ответ 1

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

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

Любая удача?

Ответ 2

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

<system.web>
    <httpRuntime maxRequestLength ="262144" executionTimeout="103600"/>
</system.web>

Ответ 3

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

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

ИЗМЕНИТЬ

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

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

Комментарий marc_s получил это право

Ответ 4

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

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

[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();

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

Ответ 8

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

Существует два способа проверки адресов портов.

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

  • Righ щелкните по проекту wcf → , чем выберите Свойства → перейдите на вкладку Веб-вкладка → Теперь в разделе Сервера → выберите Использовать сервер разработки Visual Studio → выберите Конкретный порт и укажите адрес порта, который мы ранее нашли в нашей службе Service1.svc. Это (61122).

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

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