WCF AddServiceReference, вызывающий пользовательскую ошибку инструмента, но не создающую прокси - PullRequest
5 голосов
/ 09 ноября 2009

Проблема с «Добавить ссылку на службу», а на самом деле с SvcUtil по всем его функциям. Для воспроизведения вам просто нужно добавить OperationContract с аргументом или вернуть следующий класс:

[XmlSchemaProvider("MySchema")]
public class MyStructure : IXmlSerializable
{
    private XmlElement e;

    private static void Func(object o, ValidationEventArgs args)
    {
    }

    public static XmlQualifiedName MySchema(XmlSchemaSet xs)
    {
        //xs.XmlResolver = new XmlUrlResolver();             
        XmlSchema s = XmlSchema.Read(new XmlTextReader(new StringReader("<?xml version=\"1.0\"?><xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"><xs:complexType name=\"MyStructure\"><xs:sequence><xs:any /></xs:sequence></xs:complexType></xs:schema>")), null);

        xs.Add(s);
        return new XmlQualifiedName("MyStructure");
    }

    #region IXmlSerializable Members

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        throw new NotImplementedException();
    }

    public void ReadXml(XmlReader reader)
    {
       XmlDocument doc = new XmlDocument();
       e = (XmlElement)doc.ReadNode(reader);
    }

    public void WriteXml(XmlWriter writer)
    {
        e.WriteTo(writer);
    }

    #endregion
}

В результате вы используете AddWebReference или AddSerivceReference без ссылки на библиотеку классов, содержащую тип MyStructure, все будет хорошо, и вы получите представление xmlElement на автоматически созданном прокси.

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

================

Предупреждение 1 Предупреждение о нестандартном инструменте: невозможно импортировать wsdl: portType Подробно: возникла исключительная ситуация при выполнении расширения импорта WSDL: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Ошибка: ссылочный тип «ServiceLibrary.MyStructure, ServiceLibrary, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null» с именем контракта данных «MyStructure» в пространстве имен »не может использоваться, поскольку он не соответствует импортированному DataContract. Необходимо исключить этот тип из ссылочных типов. XPath to Error Источник: // wsdl: определения [@targetNamespace = 'http://tempuri.org/']/wsdl:portType[@name='IService1'] \ Projects \ WCFSample \ WCFExample \ TestAddReference \ Ссылки на службу \ ServiceReference1 \ Reference.svcmap 1 1 TestAddReference

======================

И для вас не будет сгенерирован прокси.

Теперь в Интернете полно описаний этого, когда у вас есть универсальный DataContract и / или используется атрибут IsReference.

Это очень серьезная проблема, так как любые нетипизированные данные решат эту проблему. Не смог найти способ решить проблему. Что если я хочу узнать тип на стороне клиента, поделившись библиотекой классов контрактов?

Ответы [ 3 ]

0 голосов
/ 12 июня 2012

У меня есть предложение:
У меня были похожие ошибки, в том числе:

файл .svcmap не может быть найден. Возможно, он был перемещен или удален. Чтобы создать новый файл .svcmap, удалите ссылку на службу и добавьте ее снова.

И в этот момент невозможно удалить ссылку на службу, если я не закрою VS2010 и не открою ее снова.

Ситуация : моя служба WCF работает, я программно добавил Description.ServiceMetadataBehavior по указанному мной HTTP-адресу.

В VS2010 я пытаюсь добавить ссылку на службу по адресу HTTP, я вижу свою службу, я добавляю ссылку и вуаля, ошибки и предупреждения.

Проблема : мой HTTP-адрес содержит некоторые ключевые слова, которые не нравятся WCF. В частности, слово COM (оно также разрывается с LPT).

Итак, мое решение : измените мой HTTP-адрес, чтобы не иметь слова COM. У меня это сработало.

0 голосов
/ 28 сентября 2012

Если служба размещена через HTTPS, перейдите в диспетчер IIS сервера. В разделе «Настройки SSL» для сайта убедитесь, что установлен флажок «Требовать SSL», и установите переключатель «Сертификаты клиента» на «Принять».

0 голосов
/ 06 января 2012

Этот тип исключения обычно означает, что есть, по крайней мере, одно различие в типовых контрактах, сгенерированных сервисом, по сравнению с ссылочными типами (как указывает сообщение!). Но это может быть неочевидно на первый взгляд, как я выяснил. Убедитесь, что все вложенные и ссылочные типы обновлены на сервере. В моем случае вложенные типы были обновлены на сервере. Я думал, что обновил сборку с локальной ссылкой (и общие ссылочные типы), но я пропустил некоторые. Потребовалось тщательное изучение, чтобы найти виновника.

См. Дополнительную информацию в этот вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...