Хотя мне нравится идея провайдеров типов 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 # и обучения в то же время ;-)