Ошибка веб-службы 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. Позвольте мне подробно описать вам это решение.
есть два шага, чтобы проверить адреса портов.
в вашем проекте WCF щелкните правой кнопкой мыши файл службы (например, Service1.ВПВ) -> выберите просмотр в браузере теперь в вашем браузере у вас есть url, как http://localhost:61122/Service1.svc теперь запишите свой адрес порта как 61122
Righ нажмите ваш проект wcf - > чем выбрать свойства -> перейти к Интернет -> теперь раздел сервера -> выберите Используйте Сервер Разработки Visual Studio -> выберите конкретные Порт и дайте адрес порта, который мы ранее нашли в нашем Сервисе1.служба svc. Это (61122).
раньше у меня был другой адрес порта. После правильного указания адреса порта, который я дал в EndpointAddress моя проблема.
Я надеюсь, что это может быть решена ваша проблема.