3

だから私はカスタムタイプを返すWebサービスを持っています

public List<MyNS.Product> GetProducts(string filter)
{
    ...
}

MyNS.Product別のアセンブリで定義されています。私のクライアントアプリは同じアセンブリを参照しています。クライアントアプリにサービス参照を追加すると、戻り値のタイプはMyServiceReference.Productです。

var client = new MyServiceReference.dataSoapClient();
var products = client.GetProducts("derp");
// products type is MyServiceReference.Product[]

MyServiceReference.Product返されたタイプのオブジェクトが実際にはMyNS.Productすでに認識しているタイプであることをクライアントアプリに認識させるにはどうすればよいですか?(配列部分へのリストは大したことではなく、Tタイプだけです)

Webサービスは、Webサイトの一部としての通常のasmxです。Visual Studio内のクライアントプロジェクトにサービスを追加するために、「サービス参照の追加」を実行しています。

編集:サービス参照の追加ダイアログの「詳細」ボタンのオプションは次のとおりです。コレクションの種類を配列からリストに変更しました。また、Productタイプを使用してライブラリを具体的に選択しようとしましたが、それも役に立ちませんでした。

サービス参照オプションを追加する

4

5 に答える 5

3

サービス参照を追加するときは、ビジネスライブラリのオブジェクトを再利用するようにVSに指示します。また、サービスとクライアントが同じバージョンのビジネスライブラリを使用している限り、VisualStudioはサービスプロキシではなく適切なタイプを選択します。

于 2012-05-21T21:20:28.877 に答える
2

自動生成されたWebサービス参照コード(私はお勧めしません)を変更するか、予期されたタイプのオブジェクトを取得して返すラッパークラスでWeb参照呼び出しをラップしない限り、これを行う方法はありません。

Web参照を追加すると、IDEは、SOAPを介して返された定義に基づいて、Webサービスインターフェイスに一致するクラスを自動的に生成します。したがって、Productのような複合型を使用すると、同じパブリックプロパティを持つ独自のProductクラスが自動的に生成されます。

于 2012-05-21T21:18:56.243 に答える
0

soapを使用しているため(.asmxはSOAP Webサービスを作成します)、クライアントはasmxが作成しているsoapのwsdlページから入力をプルできる必要があります。渡すオブジェクトがxmlシリアル化可能であることを確認する必要があります。

原則として、dto(データ転送オブジェクト)を作成して、クライアントに渡されたデータを格納し、シリアル化可能であることを確認し、既存のオブジェクトの更新によって引き起こされる問題を防ぐために、アプリケーションの他の部分からデータを切り離します。

これは、.NET以外のクライアントでも機能します。たとえば、Javaで.NETからのSOAP呼び出しを同じ方法で使用できます。

于 2012-05-21T21:31:01.130 に答える
0

共有タイプはWCFで導入された機能ですが、古いasmxWebサービスでは導入されていません。古いASMXの場合は、SchemaImporterExtension:linkを試してください。

編集:OK。そこでテストしました。これは、サービスコントラクト、要求および応答クラスを手動で作成し、チャネルを手動で作成することで実行できます。あなたはあなたの契約を設定[XmlSerializerFormat]し、あなたのオブジェクトが持っていることを確認する必要があります[SerializableAttribute]

于 2012-05-21T21:28:34.560 に答える
0

まあ、それは古い投稿だと知っていますが、(残念ながら)同じ問題を抱えているので、解決策を共有できると思いました。

プロローグ

私はasmxWebサービス(.netバージョン2.0)を使用しており、両方のプロジェクト(実際にはWebサービスとクライアント)のアセンブリで参照されるカスタムタイプ([serializable]属性を持つ)を返すWebメソッドを使用しています。シェア。

私が見つけた解決策は、Visual Studioに(クライアントプロジェクトで)クライアントを作成させてから、作成したReference.csファイルを変更することです(これを確認するには、[すべてのファイルを表示]をオンにする必要があります)。

また、クライアントプロジェクトの.NETバージョンは2.0である必要があります。

しかし、注意してください!

自動生成されたファイルであるため、Webサービス参照を更新すると、すべての変更が失われます。だから多くの注意を払ってください

このファイル(reference.cs)でわかるように、カスタムタイプはすべてのプロパティで再作成され、クラスが別のクラスから継承されている場合(私の場合のように)、基本クラスも再作成されます。明らかに問題は、再作成されたタイプが共有アセンブリと同じではないことです。

私が見つけた解決策は、生成されたクラスの名前を変更し(たとえば、名前の前に「_」を付ける[YOUR_BASECLASS_NAME => _YOUR_BASECLASS_NAME])、Reference.csの「using」部分に次のように配置することです。

using YOUR_BASECLASS_NAME = SHAREDLIBRARY.BASECLASS
using YOUR_CLASS_NAME = SHAREDLIBRARY.CLASS

使用するすべてのクラスに対してこれを行います。

コンパイル..etvoilà!私はそれがあまり良い解決策ではないことを知っていますが、それは私が見つけた中で最も賢いです。

于 2015-08-06T10:08:59.157 に答える