Ошибка веб-службы 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, моя проблема была решена.
Я надеюсь, что это может решить вашу проблему.