2009-03-04 32 views
3

Webサービスのコンテキストでは、クラスMammalから継承した次のクラスがあります。 Mammalクラスはプロキシで定義されています。私はそのクラスの定義を変更することはできません。クライアントサイドのMammalクラスにいくつかのメソッドを追加する必要があるので、私はMammalを継承し、Giraffeを作成しました。WebService、WebMethodおよび継承

namespace TestApplication 
{ 
    public class Giraffe : Mammal 
    { 
     public Giraffe() 
     { 
     } 
    } 
} 

私はタイプの哺乳類のオブジェクトを期待するWebメソッドを呼び出すと、私はキリンが期待されていないことを私に言って、次の例外を取得します。

Error: System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Giraffe was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically. 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write6_Tender(String n, String ns, Tender o, Boolean isNullable, Boolean needType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write12_PaymentRequestAuthorization(String n, String ns, PaymentRequestAuthorization o, Boolean isNullable, Boolean needType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write13_PaymentRequestAuthorization(Object o) 
    --- End of inner exception stack trace --- 

回避策はありますか?私は実際にXmlIncludeを追加することはできません...

+0

私はこのケースでは部分的なクラスを使用することはできません怖いです。このスレッド http://stackoverflow.com/questions/20084/xml-serialization-and-inherited-types –

答えて

2

メソッドを追加するには、部分クラスを使用する必要があります。 (右の名前空間などで)と2番目のクラスファイルを追加してみてください:

partial class Mammal { 
    public void ExtraMethod() {...} 
} 

partialキーワードは、クラスが複数のファイルに分割することができるようにコンパイラに指示します - コード生成のシナリオのための理想的。ただし、すべてのファイルにキーワードpartialが必要です。メンバは単純に結合されます(C#3.0の部分的なメソッドを除いて、独自の微妙な動作があります)。私希望これはwsdl.exe(または何でも)が含まれています!

+0

を見てください。サーバー上のクラスを変更するにはどうすればよいですか? – Martin

+1

好奇心を離れて、どうしてですか?特に、プロキシはサーバ上にありません...あなたは実際に何をしようとしていますか?これまでのところ、あなたの説明はおおまかに「クライアントサイドのWebサービスプロキシにメソッドを追加する」ものです。部分的なクラスは、そのシナリオの正解です... –

1

XmlIncludeを使用する必要があります。あなたの唯一の選択です。シリアル化を行うコードを生成する必要があるため、シリアライザにどのクラスをシリアライズするかを伝える必要があります。

これを書きながらそれはちょうどあなたがキリンは、IXmlSerializableを実装したと離れて得るかもしれないと、私を襲ったが、それはさらに多くの仕事です。

2

変更できないクラスにメソッドを追加したい場合は、単に拡張メソッドを作成します。

public static class MammalExt { 
public static void ExtraMethod(this Mammal mammal) {...}} 

哺乳類がプロキシ生成クラスである場合、部分クラスでなければなりません。

1

正解は本当に部分クラスを使用することです。クライアントプロジェクトを開いてWeb参照を生成すると、Visual StudioはWSDLを解析し、Mammalというクラスを生成します。このクラスはクライアントプロジェクトでのみ表示されるため、サーバーサイドについて心配する必要はありません。

MyWebServiceというWeb参照があるとします。次に、MyWebService.Mammalというクラスがあります。あなたがMammalを返すWebサービスのメソッドを呼び出すと、Web参照のコードは、新しいを作成します

namespace MyWebService { 
    public partial class Mammal { 
     public void ExtraMethod() { ... } 
    } 
} 

:このクラスにメンバーを追加するには、あなたがする必要があるのは、これを含む新しいソースファイルを作成していますあなたの "改良された" Mammalクラスのインスタンスを作成し、ワイヤ上のxmlの値をインスタンスにコピーします。

関連する問題