Nano Hash - криптовалюты, майнинг, программирование

Ошибка поставщика типа F# wsdl?

Хотя мне нравится идея провайдеров типов F#, моя первая серьезная попытка их использования потерпела крах.

Я собирался подключиться к службе (WCF) с помощью WsdlService<"http://someurl/some.svc?wsdl">

Это эпично терпит неудачу с:

Поставщик типов «Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders» сообщил об ошибке: tmp6E6C.cs(9409,26): ошибка CS0644: «System.ComponentModel.PropertyChangedEventHandler» не может быть получен из специального класса «System.MulticastDelegate» c :\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll: (расположение символа, связанного с предыдущей ошибкой)

и много других предупреждений, которые, вероятно, не имеют значения:

tmp6E6C.cs(290,28): предупреждение CS0436: тип «System.Data.DataRowState» в «c:\Users\someuser\AppData\Local\Temp\tmp6E6C.cs» конфликтует с импортированным типом «System.Data. DataRowState» в «c:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll». Используя тип, определенный в «c:\Users\someuser\AppData\Local\Temp\tmp6E6C.cs». tmp6E6C.cs(9427,17): (Расположение символа, связанного с предыдущим предупреждением)

Это известная функция ;-) или я неправильно ее использую?

К сожалению, я не могу опубликовать WSDL, и он довольно большой с большим количеством типов, поэтому я должен признать, что я несколько ленив и не урезал его. OTOH, если бы я знал, какая часть WSDL нарушает или создает эту ошибку, я бы, конечно, поместил ее здесь.

Изменить WSDL также нельзя, поэтому меня в основном интересует, почему поставщики типов F # WSDL не могут обрабатывать этот (WCF) WSDL или что я делаю неправильно.

Он отлично работает при использовании C# и svcutil.exe из VS2010.

Я пробовал все параметры WsdlTypeProvider, и они дают тот же результат (конечно, кроме ForceUpdate). Должен ли я использовать эти сервисы по-другому с помощью F#?

================================================== ============================= Добавлена ​​информация (поскольку я новичок и не хотел отвечать. Не спрашивайте почему :):

Всем спасибо за ответы/комментарии.

Я действительно частично пошел этим путем (вручную, используя svcutil). Как я пытался сказать выше, я пытался использовать svcutil вручную, и он терпит неудачу при компиляции сгенерированного кода C# (в библиотеке, кроме F#).

То есть я сделал следующее:

1) Создайте контракт, настроив ссылку в графическом интерфейсе VS 2010. Это работает так, как ожидалось

2) Попробуйте создать его с помощью svcutil из командной строки. Затем компиляция этого файла завершается с той же ошибкой.

Как мне кажется, то, что происходит в svcutil из командной строки и что происходит при использовании svcutil (или того, что используется) из графического интерфейса, добавляющего ту же службу, не генерирует код с теми же параметрами. Я предполагаю, что это частично контролируется тем фактом, что я пытаюсь использовать службу WCF, а не «чистую» WSDL/веб-службу, и поставщик типов предполагает, что я пытаюсь использовать «чистую» веб-службу.

Мне не удалось найти какие-либо параметры для svcutil, которые позаботятся об этом, или любые возможные комбинации параметров, не говоря, что я пробовал все перестановки комбинаций, но пробовал те, которые вероятны, основываясь (пытаясь) на глубоком чтении документации svcutil (и я не совсем новичок в использовании его из командной строки).

До сих пор я пришел к выводу, что причиной этого являются некоторые «отсутствующие» параметры для svcutil, и что поставщик типа F # не виноват. Я все еще очень хотел бы как-то решить эту проблему, все еще используя поставщиков типов F #, но запасной вариант - сгенерировать код с помощью графического интерфейса на C #, а затем снова сослаться на эту часть кода в F #. Это не то элегантное решение, которое я пытался найти, поскольку у меня много сервисов, и мне бы очень хотелось создать такой хороший способ прототипирования и тестирования этих сервисов.

Другой запасной вариант, конечно, также отказался бы от всей части F # и просто пошел бы с некоторым модульным тестированием и т. Д., Но это снова сводит на нет цель проникновения в F # и обучения в то же время ;-)


  • Он отлично работает при использовании C# и svcutil.exe из VS2010. Это интересно. Я потратил пару дней, пытаясь использовать провайдеров типов с реальными веб-службами (включая WSDL), и не смог заставить ни одну вещь работать, кроме примеров F#. Поэтому мне интересно услышать, что это может быть проблема, связанная с F#, а не общая проблема .NET... 19.10.2012
  • Я положительно думаю, что это не проблема .net (она работает при использовании svcutil, поэтому...), а скорее проблема в WsdlProvider или в фактической службе, представляющей собой некоторый WCF, выполняющий какое-то расширенное или скрытое использование WSDL, не учитываемое в реализация провайдера. Конечно, это может быть я делаю что-то не так. Или сочетание всего. Приятно слышать, что у других были проблемы с его использованием. Какие ошибки вы получили при попытке использовать WsdlProviders? Были ли это также сервисы WCF или сервисы, созданные иным образом? 19.10.2012
  • Он отлично работает при добавлении ссылки в графический интерфейс VS2010. Он генерирует ту же ошибку, если создает файл из описания службы в CS-файл, по-видимому, при использовании svcutil из командной строки. 19.10.2012
  • Очень трудно сказать, что это работает на C#, но не работает на F#, не видя точного кода C# и точного кода F#. Если есть какой-то способ опубликовать небольшой фрагмент кода на обоих языках, демонстрирующий проблему, это было бы очень полезно. Сказать, что код одинаков на двух разных языках, — это довольно долго. 19.10.2012
  • Что мешает вам опубликовать WSDL? Безопасность через неизвестность? 22.10.2012
  • Внешний консультант, публикующий внутренний WSDL в Интернете, к сожалению, несколько выходит за рамки того, что может быть разрешено. Как было установлено, дело не в f#, c# или WSDL, я думаю, а скорее в различиях между тем, как обрабатывается WSDL в разных случаях. 22.10.2012
  • @OnorioCatenacci, если вы не понимаете рассматриваемого дела, пожалуйста, перефразируйте ответ. Поставщик f# wsdl основан на создании кода C# в фоновом режиме и повторном использовании созданной библиотеки. как таковой, это фактически один и тот же код, созданный даже на том же языке. 22.10.2012
  • @user1758475 user1758475 Я не ответил - я оставил комментарий. Судя по скудному описанию проблемы, которую вы изначально дали (которую я комментировал), казалось возможным, что вы делаете какие-то необоснованные предположения. 22.10.2012

Ответы:


1

Поставщик типов WSDL (и некоторые другие) используют SvcUtil в фоновом режиме для выполнения тяжелой работы. Если вы откроете ProcExp из taskmgr или другого подобного инструмента, вы увидите, что процесс SvcUtil запускается после вставки кода TP в Visual Studio. По крайней мере, с ProcExp вы можете увидеть полную командную строку с аргументами, которые использовались.

Поэтому выясните, какая именно командная строка SvcUtil была вызвана TP для вашей службы, и проверьте, работает ли она вне среды F#.

Интересен тот факт, что SvcUtil работает с C#/VS 2010. Я предполагаю, что если вы используете TP F #, вы сейчас используете VS 2012. Если это так, версия самого SvcUtil может быть другой, что может быть связано.

Конкретная ошибка будет выглядеть так же, как описано здесь, поэтому в коде службы могут быть неполные аннотации.

19.10.2012
  • Я не думаю, что эта ссылка полностью актуальна (возможно, я не совсем понимаю проблему!). Почему я предполагаю, что это больше объясняется в дополнении к исходному сообщению, и вкратце потому, что я могу генерировать правильный код при использовании графического интерфейса в VS 2010 для добавления сервисов. Сгенерированный код отличается в двух случаях. Cmdline svcutil предполагает чистый wsdl, но материал с графическим интерфейсом понимает, что это WCF (или что-то еще), и по-разному обрабатывает PropertyChangedEventHandler. 20.10.2012
  • И C# GUI, и F# TP используют SvcUtil для создания кода на стороне клиента. В использовании SvcUtil есть 2 переменные — версия самого SvcUtil и переданные ему аргументы. Если он работает в VS 2010 C#, но не в VS 2012 F#, то либо версия инструмента другая, либо аргументы другие, либо и то, и другое. Узнайте, в чем заключается эта разница, и это должно указать вам на следующий шаг исправления/обходного пути. Я включил ссылку, чтобы намекнуть, почему инструмент может дать сбой — возможно, последняя версия более строгая, чем предыдущие версии. 20.10.2012
  • Я пытался использовать версию svcutil для cmdline из 2010 года. Она дает ту же ошибку при компиляции кода C#... Похоже, что она также генерирует тот же код с cmdline 2012 года. 20.10.2012
  • @latkin И C# GUI, и F# TP используют SvcUtil для генерации кода на стороне клиента: это неверно для VS 2008, см. ссылка. Я думаю, что это также неверно для VS 2010: когда я добавляю ссылку на службу через диалог, svcutil.exe никогда не запускается в диспетчере задач. Я не знаю о VS 2012. 22.10.2012
  • @MarcSigrist - Вы правы, мой предыдущий комментарий неверен. Спасибо, что указали на мою ошибку для будущих читателей! Я предполагаю, что когда-то в графическом интерфейсе ссылки на сервис VS использовался svcutil, но начиная с VS 2008 это уже не так. Теперь мы получаем несоответствия между двумя подходами - шокирующие! 24.10.2012
  • @MarcSigrist, так что все сводится к следующему: как заставить svcutil вести себя как ASR (добавить ссылку на службу)? Или если это возможно? 24.10.2012
  • @user1758475 user1758475 По-видимому, ASR применяет некоторые дополнительные внутренние проверки и другие функции, которые неизвестны svcutil. Следовательно, вы не можете заставить svcutil вести себя как ASR во всех отношениях. Кроме того, даже если бы вы могли это сделать, это не помогло бы, потому что svcutil доступен внутри поставщика типов. Единственный способ решить проблему — написать собственный провайдер типов (на основании чего, если svcutil недостаточно хорош?) или дождаться будущей, более стабильной версии официального провайдера типов WsdlService (который, возможно, повторно реализует части АСР)... 24.10.2012
  • @MarcSigrist Очень плохо, когда это была серьезная попытка его использовать. Я, конечно, сгенерирую ее обычным способом, а затем снова использую эту библиотеку на F#, но тогда я мог бы также остаться на C# и написать несколько обычных модульных тестов и т. д. Не могу сказать, что мне это нравится! ;-) 24.10.2012

  • 2

    Я не могу оставить эту тему...

    Сейчас я сделал следующее:

    1. Запустите svcutil с простой настройкой vanilla: svcutil http://some.address/some/path.svc
    2. Запустите с дополнительным параметром: svcutil /r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\System.dll" /r:"C:\Program Files (x86)\ Справочные сборки\Microsoft\Framework.NETFramework\v4.5\System.Data.dll" http://some.address/some/path.svc

    Это создает следующие различия в файле С# (очевидно, он присутствует в 1) и отсутствует в 2):

    namespace System.ComponentModel
    {
        using System;
    
    
        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
        [System.SerializableAttribute()]
        public partial class PropertyChangedEventHandler : System.MulticastDelegate
        {
    
            public PropertyChangedEventHandler(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : 
                    base(info, context)
            {
            }
        }
    }
    namespace System.Data
    {
        using System;
        using System.Runtime.Serialization;
    
    
        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
        [System.FlagsAttribute()]
        [System.Runtime.Serialization.DataContractAttribute(Name="DataRowState", Namespace="http://schemas.datacontract.org/2004/07/System.Data")]
        public enum DataRowState : int
        {
    
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Detached = 1,
    
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Unchanged = 2,
    
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Added = 4,
    
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Deleted = 8,
    
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Modified = 16,
        }
    }
    

    Что снова заставляет файл компилироваться в 2) и, как и ожидалось, в противном случае.

    Несколько странная часть: почему System.dll не используется в провайдерах F # wsdl при запуске svcutil? System.Data.dll я как бы понимаю, так как это не используется по умолчанию при запуске svcutil (по крайней мере, согласно документации).

    OTOH Я также думаю, что в документации сказано, что ЕСЛИ сборки находятся в GAC, он должен их использовать. Итак, как мне проверить, что они там, и/или загрузить их в сборку, если нет?

    Запуск gacutil -i System.dll (в версии 4.5 System.dll) дает:

    Не удалось добавить сборку в кеш: Попытка загрузить программу с неверным форматом.

    Это какая-то проблема 64/32 бит? (Я на 64-битных окнах, если это имеет какое-либо значение)

    Или, перефразируя проблему: как мне получить System.dll и System.Data.dll часть ссылок при запуске svcutil, если я не могу добавить ссылки напрямую через часть WsdlProvider?

    Я почти уверен, что он не использует System.dll, поскольку, если я добавлю параметр типа коллекции в wsdlprovider:

    WsdlService<"http://some.url/some/path.svc", "c:\\temp\\wsdl\\some.wsdlschema", true, ".", true, true, false, false, "System.Collections.Generic.List'1">
    

    он также жалуется на следующее:

    Поставщик типов "Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders" сообщил об ошибке: Ошибка: не удалось загрузить тип для значения System.Collections.Generic.List'1, переданного параметру /collectionType. Убедитесь, что сборка, к которой принадлежит этот тип, указана с помощью параметра /reference.

    который должен был быть доступен напрямую, если ссылались на System.dll (я думаю).

    Любые идеи для дальнейшего изучения или решения этой проблемы?

    29.10.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..