Типы веб-служб не обновляются - PullRequest
2 голосов
/ 04 мая 2011

Я столкнулся со странной проблемой.Когда я обновляю один из моих веб-сайтов до веб-службы с помощью

  1. Обновляя его или
  2. Удаление службы и полное ее чтение

Intellisense по-прежнему сообщает, что тип, в данном случае Document_Type3, является тем же типом объекта, сгенерированного службой.Я могу установить тип моего объекта в Document_Type3.Я создаю проект, без проблем.

enter image description here

Однако, когда я запускаю проект, я получаю сообщение об ошибке компилятора, говорящее, что мой объект Document_Type3 не содержит Order.

Compiler Error Message: CS0117: 'DynamicsNAV.Document_Type3' does not contain a definition for 'Order'

Source Error:

Line 376:                comment.Date = DateTime.Now;
Line 377:                comment.DateSpecified = true;
Line 378:                comment.Document_Type = Document_Type3.Order;  <-- right here.
Line 379:                comment.Document_TypeSpecified = true;
Line 380:                comment.Line_No = i * 1000;

Черт, это не так.Я могу видеть это прямо там.

  <xsd:simpleType name="Document_Type">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="Quote" />
      <xsd:enumeration value="Order" />
    </xsd:restriction>
  </xsd:simpleType>

Я могу установить это хорошо, скомпилировать это хорошо - но я не могу запустить его.

Я уничтожил свои временные файлы в

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files

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

Когда я запускаю его - то же самое - без ошибки компилятора, пока он фактически не загрузится в браузере.Важно отметить, что эти сервисы возвращаются Dynamics NAV, и типы с одинаковыми именами, например Document_Type, будут добавлены с цифрой в конце.Опять же, в коде Document_Type3 содержит Order и Quote.

Что, черт возьми, происходит?

1 Ответ

1 голос
/ 12 мая 2011

Это определенно ошибка в генерации кода Visual Studio / Web-сервиса. Вот мое объяснение того, что, по моему мнению, происходит и как исправить это обойти это.

В NAV (или любых других веб-службах), где существует объект с нечетким именем, в данном случае "Document_Type", очевидно, что сборка выходит из строя при компиляции.Например, у меня может быть три отдельных объекта WSDL, которые все определяют тип документа.Например,

CustomerSale.wsdl
WebSale.wsdl
VendorSale.wsdl

Когда код Visual Studio генерирует объект, он проходит через каждый из моих объектов WSDL, находит Document_Type и соответственно перечисляет.например,

CustomerSale.Document_Type -> Document_Type1
WebSale.Document_Type -> Document_Type2
VendorSale.Document_Type -> Document_Type3

Однако, когда сеть компилирует объекты, объекты выходят из строя.например,

CustomerSale.Document_Type -> Document_Type1
WebSale.Document_Type -> Document_Type3
VendorSale.Document_Type -> Document_Type2

Я не уверен, зависит ли это от алфавитного порядка объектов или какой-либо другой переменной, но это определенно происходит.

Я не вижу рифмы или причиныони будут не синхронизированы, но простое решение (в моем случае) состоит в том, чтобы просто удалить объект WSDL, что приведет к путанице с компилятором.В любом случае мне это не нужно.

Чтобы выяснить во время выполнения, какой объект вызывал путаницу в компиляторе, я отразил тип:

Response.Write(WebSale.Document_Type.GetType().ToString);
Response.End();

Затем я перешел к определению, вв этом случае Document_Type2 и увидел, что это определенно не тот же объект.Затем я удалил объект из своих веб-сервисов и web.config - и перекомпилировал.Мой веб-объект сразу превратился в Document_Type2!Это все прояснило и позволило сайту скомпилироваться в реальном браузере.Теперь они были синхронизированы.

Однако я понимаю, что не у всех есть объекты, которые они могут удалить, поскольку они могут использовать эти объекты.Другим обходным решением будет динамическое задание объекта с помощью отражения.Вместо привязки вашего типа объекта к `Document_Type2 'вы можете вместо этого отразить тип и привести при необходимости.например,

//Document type will throw error at run time.
//comment.Document_Type = DynamicsNAV.Document_Type3.Order; <-- removed.
// I don't care what the name of the object is,
// I know that it contains Order.   
var prop = comment.GetType().GetProperty("Document_Type");
prop.SetValue(comment, Enum.Parse(prop.PropertyType, "Order"), null);

Я надеюсь, что это решение поможет другим, кто испытывает ту же проблему!

...