2009-07-22 7 views
16

基本的に、私はメンバXとYを持つサーバー側の型 "Foo"を持っています。Visual Studioの "Add Server Reference"を使うと、WSDLと生成されたプロキシの両方が "Field"最初の文字の括弧を変更します。 IE、 "X"、 "Y"は "xField"と "yField"に変更されています。なぜこれが起こっているのか?私はパターンを理解することはできません。なぜWCFは生成されたプロキシタイプの最後に「フィールド」を追加するのですか?

詳細 - 私は "Foo"タイプを公開するレガシーASMX Webサービスを持っています。私は古いWebサービスのラッパーである新しいWCFサービスを作成しました。新しいサービスはこれらのメソッドをラップして、おそらくいくつかのフィールドの値を更新しますが、まったく同じメソッドを公開し、まったく同じ型を返します。私は参照を何度か再作成しようとしましたが、たびに常に自分のフィールドの名前を変更します。変数 "STUFF"はwsdlとプロキシで "sTUFFField"として公開されています。変数 "X"は "xField"などとして公開されています

面白いことですがパターンを理解できません - 新しいASMX Webサービスをテストとして作成してラップすることを試みました - 変数の名前が変更されません次に。だからWCFが変数の名前を変更する理由/パターンのパターンを理解することはできません。

誰でも知っていますか?

+0

重要ですか?もしそうなら、_how_は重要ですか? –

+2

それは問題です。私は2つのユースケースを持っています(内部対外部ユーザー用)。内部ユーザーは、ラッパーサービスをバイパスして、基本的なレガシーサービスに直接行くことができます(これにより、ログインの必要性は回避されます)。外部のユーザーは、ラッパーサービスを経由してパスワードなどを与えなければなりません。しかし、内部および外部のサービスがフィールドに異なる名前を付けるので、両方のサービスと話すために同じコードを共有することはできません。私は各サービスごとに異なるバージョンのコードを書く必要があります。 – tavistmorph

答えて

3

通常、生成されたプロキシは内部/保護/プライベートフィールドとして "XField"と "YField"を持ち、 "X"と "Y"というプロパティを通じて値を公開します。プロキシクライアントを作成して好みに合わせて調整できるオプションがあります。

更新:この動作を制御するためのスイッチやオプションはありません。これは、クライアントプロキシの作成にシリアライザ(DataContractSerializer vs. XmlSerializer)WCFが使用するものによって異なる場合があります。

結局のところ、それは多かれ少なかれコーディングスタイルの問題です。機能的には違いはありません。

マルク・

+0

それは正常に動作する方法ですが、パブリックフィールドの名前が変更されています。したがって、内部フィールドは「XFieldField」と呼ばれ、パブリックアクセサリは「XField」と呼ばれます。私が欲しいものではなく、ラッパーサービスへのインターフェースが実際のサービスへのインターフェースと異なることを意味します。だから私はもはや2つのサービスを相互に扱うことができません。 – tavistmorph

+0

これは奇妙で予想外のことです。クライアントプロキシはどのように作成しますか? Visual Studioまたはsvcutil.exeを使用していますか? –

+0

正確に - 奇妙で予期しない。この1つのプロジェクトでのみ起こっているので、私はパターンを理解することはできません。しかし、 "Add service reference"をクリックするだけで、Visual Studioでクライアントプロキシを作成しました。 – tavistmorph

4

私は同じ問題を抱えていたが、私は解決策を見つけることができました。

[DataContractFormat]タグを追加すると、インターフェイスで「XFieldField」という大文字となります。 ただし、インターフェイスで[XmlSerializerFormat]に置き換えると、生成されたプロキシの名前は変更されません。

19

私は同じ問題を抱えており、sergiospの答えは私を正しい方向に向かわせました。うまくいけば、他の人を助けるためにいくつかの追加情報を追加するだけです。

インターフェイスに[System.ServiceModel.XmlSerializerFormatAttribute()]を追加し、クライアントコードを再生成すると、私の問題が解決されました。

public interface IMyService 
{ 
    [System.ServiceModel.XmlSerializerFormatAttribute()] 
    [System.ServiceModel.OperationContract] 
    recordResponse GetRecord(recordRequest request); 

} 
+0

助けてくれてありがとう。それは私のためにも解決されましたが、あなたはそのコードが何をしているのか、それがどのように問題を解決しているのかを知っていますか? – batmaci

+1

@batmaci Visual Studioで "サービス参照の追加"を実行すると、WCFはサービスを呼び出すためのクライアントコードを生成しています。デフォルトでは、DataContractSerializerが使用されます。 XmlSerializerFormatAttributeを追加すると、WCFはXmlSerializerを使用してコードを生成します。 XmlSerializerFormatAttributeを使用してサービス参照を1回追加し、生成されたコードファイル(Reference.cs)の差異を比較して比較します。 – tgriffin

+0

この回答は2年間ここに座っているとは思えません。私はこの答えのためにSOとウェブを狂って探しています。これは文字通り私の祈りの答えです。この同じ問題に直面している将来のあなたの人のためのものであれば、[ここ](http://stackoverflow.com/a/20713299/2453110)はDocuSignイベントリスナーの構築に関する私の同様の質問へのリンクですConnect通知サービスのためのものです。 –

0

私もこの問題を抱えていたが、クライアントから、私はまださえ界面で述べた変更を行った後、クラスのメンバーの最後にFieldを得ていました。

私はDataContractSerializerを使ってディスクファイルのシリアル化されたリクエストを処理していました(私たちのサービスのテスト中に、私たちはライブから行く前にデバッグできるように、プロバイダからシリアル化されたリクエストを受け取りました)。

後に変更XmlSerializerからDataContractSerializer、(デフォルトでは、XmlSerializersは、標準の名前空間を作成するため)、私は要求をデシリアライズしてと完璧に仕事ができる(typeof()呼び出しによって)そのコンストラクタにルート要素を指定し、rootnamespace WCFサービス。

希望すると、誰かに役立ちます。私はこの "問題"で多くの時間をsoooo失った。

関連する問題