2

サードパーティ プロバイダーがホストする Web サービスに接続しています。プロジェクトのサービス参照を Web サービスに追加しました。VS は必要なすべての参照とクラスを生成しました。

このコードで接続しています (クライアント名とメソッドは匿名化されています):

 using (var client = new Client())
 {
     try
     {
         client.Open();
         var response = client.Method(...);
         return response.Status;
     }
     catch (SoapException ex)
     {
         throw CreateServiceException(ex);
     }
     finally
     {
          client.Close();
     }
 }

client.Open() に到達すると、次のメッセージで例外が発生します。

名前空間 '' の最上位の XML 要素 '_return' は、個別の型 System.Boolean および Service.Status を参照しています。XML 属性を使用して、要素または型の別の XML 名または名前空間を指定します。

reference.cs では、「_return」変数が次のように装飾されていることがわかります。

[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)]

wsdl、生成されたサービス参照、またはコードに問題がありますか?

更新:古い学校の Web サービスとしてサービスを生成すると、問題が解決します。今のところ、Sixtoの回答を承認済みとしてマークしましたが、何が問題を引き起こしたのか、サービスジェネレーターへのパラメーターが元の問題を解決できるかどうか、まだ興味があります.

4

1 に答える 1

2

サービス参照を作成できた場合、WSDL は有効です。例外メッセージは、_return に名前空間/型のあいまいさの問題があることを示しています。生成されたコードはおそらく、あるコンテキストではブール値として使用し、別のコンテキストでは Service.Status 型として使用しています。

サービス メソッドを呼び出す前に ClientBase.Open メソッドを呼び出しません。その必要性を見たことがないからです。私は常に、必要に応じて Close & Abort メソッドを呼び出します。Open メソッドは基本的に、クライアントの状態を構成不可に変更するだけです。継承されたメソッドであるため、生成されたクラスでコードをトリガーする方法がわかりません。その行を削除して、同じ例外が発生するかどうかを確認します。それ以外の場合、まだ行っていない場合は、生成されたコードで _return が使用されているすべての場所を検索し、適切な型を手動で分類できるかどうかを確認してください。コンテキストごとに異なる名前が必要になる場合があります。

WSDL をトラブルシューティングするもう 1 つの方法は、Web 参照を作成し (HTTP ベースのサービスであると仮定)、生成コードが期待どおりに機能するかどうかを確認することです。機能する場合は、WCF プロキシ機能が必要でない限り、ASMX クライアントを使用してください。

于 2008-09-25T19:25:09.590 に答える