2

奇妙な問題が発生しました。自分のWebサイトの1つをWebサービスに更新するとき

  1. それを更新する
  2. サービスの削除と完全な再読み込み

インテリセンスは、タイプ、この場合Document_Type3はサービスによって生成されたオブジェクトと同じタイプであることを報告します。オブジェクトタイプを`Document_Type3'に設定できます。私はプロジェクトを構築しますが、問題はありません。

ここに画像の説明を入力してください

ただし、プロジェクトを実行すると、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

おそらくこれらの動的に生成されたオブジェクトをキャッシュしたと考えています。プロジェクトを再構築し、一時ディレクトリにオブジェクトとともにWebサイトが再表示されるのを確認しました。

私がそれを実行するとき-同じこと-それが実際にブラウザにロードされるまでコンパイラエラーはありません。注意すべき重要な問題は、これらのサービスがDynamics NAVによって返されることであり、Document_Typeなどの同じ名前の型には、末尾に数字が追加されます。このコードでも、Document_Type3にはとが含まれOrderていQuoteます。

一体何が起こっているのですか?

4

1 に答える 1

1

これは間違いなくVisualStudio/Webサービスコード生成内のバグです。これが私が起こっていると私が信じていることとそれを回避する 方法についての私の説明です。

明確に名前が付けられていないタイプのオブジェクトが存在するNAV(またはその他のWebサービス)では、この場合"Document_Type"、ビルドがコンパイルされたときにビルドが故障しているようです。たとえば、すべてドキュメントタイプを定義する3つの個別の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

ただし、Webがオブジェクトをコンパイルすると、オブジェクトの順序が乱れます。例えば

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サービスとweb.configから削除し、再コンパイルしました。私のWebオブジェクトはすぐに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);

この解決策が同じ問題を経験している他の人に役立つことを願っています!

于 2011-05-12T15:43:27.863 に答える