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

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

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

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

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

IEnumerable<MyClass> GetThings(out string errMsg);

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

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

8 ответов


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

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

что-нибудь?


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

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

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

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

редактировать

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

Изменить 2

marc_s был прав

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

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

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

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


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

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


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

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

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

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

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

есть два шага, чтобы проверить адреса портов.

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

  2. Righ нажмите ваш проект wcf - > чем выбрать свойства -> перейти к Интернет -> теперь раздел сервера -> выберите Используйте Сервер Разработки Visual Studio -> выберите конкретные Порт и дайте адрес порта, который мы ранее нашли в нашем Сервисе1.служба svc. Это (61122).

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

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