2012-04-12 3 views
4

Ich möchte einen lose eingegebenen Parameter in meiner Webmethode.WCF OperationContract mit lose eingegebenen Parameter

Ich habe ein Szenario, in dem der Client beliebige 25 DataContract-Objekte in den WCF-Vorgang senden kann, z.

proxy1.myFunction(PersonObject) 
proxy1.myFunction(ComputerObject) 

Meine Einschränkung ist, es sollte nur ein Operation Contract auf dem Client ausgesetzt sein.

Wie kann ich eine Webmethode erstellen, die eine der 25 DataContract-Klassen als Parameter verwenden kann? Ich versuchte mit object als Art des Parameters und gab KnownType Attribut zu den DataContract Klassen, aber ich hatte kein Glück während des Serialisierungsprozesses.

Antwort

8

Ich habe gerade dies getan, ich fand, dass Sie das KnownTypesAttribute der Schnittstelle hinzufügen müssen.

[ServiceContract] 
[ServiceKnownType(typeof(MyContract1)] 
[ServiceKnownType(typeof(MyContract2)] 
[ServiceKnownType(typeof(MyContract3)] 
public interface IMyService 
{ 
    [OperationContract] 
    object TakeMessage(); 

    [OperationContract] 
    void AddMessage(object contract); 

} 

in Ihnen Implementierung, müssen Sie die Art überprüfen, um sicherzustellen, dass es eine Ihrer Datacontracts ist.

EDIT

Wenn Sie eine Menge von Verträgen haben, können Sie Reflektion verwenden sie den KnownTypes hinzuzufügen.

internal static class KnownTypeHelper 
{ 
    public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider = null) 
    { 
     var types = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.Namespace == "Company.Path.To.DataContractsNamespace").ToArray(); 

     return types; 
    } 
} 

Dann können Sie Ihre Schnittstelle deklarieren,

[ServiceContract] 
[ServiceKnownType("GetKnownTypes", typeof(KnownTypeHelper))] 
public interface IMyService 
{ 
    [OperationContract] 
    object TakeMessage(); 

    [OperationContract] 
    void AddMessage(object contract); 
} 

Dies ist ein viel sauberer Weg, es zu tun.

+0

Ahhh! Ich sehe ... Das ist, was ich gesucht habe ... Vielen Dank für die schnelle Antwort. – user1312242

+0

OMG !! Awesome ... das hört sich so an, als würde man weniger schreiben und mehr tun :-), aber ich denke, Reflektion verlangt wenig Leistung, die sich verschlechtert ... – user1312242

1

Nun eine Sache, die Sie versuchen könnten, ist, erstellen Sie eine Schnittstelle wie IObj, und implementieren Sie diese Schnittstelle für die 25 verschiedenen Daten Vertragsobjekte. Dann geben Sie für Ihren Betriebsvertrag den Parametertyp IObj an. Dies würde Ihnen helfen, die 25 Params einzusenden.

+0

ohh Das ist eine großartige Idee .. Lass mich das gleiche simulieren .. Aber ich habe eine Frage, sprich sag Die Schnittstelle IObj hat zwei Operationen, dann sollten alle Datenkontraktklassen diese implementieren. Noch ein weiteres Problem ist: sagen wir, dass die Webmethode IObj als Parametertyp verwendet hat ... Nun, wenn der WCF-Client ComputerObject in dieser Webmethode sendet, können wir nach der Typumwandlung bei WCF Side ein Objekt vom Typ IObj bekommen. Ich meine, wir könnten es vermissen aus ein paar Eigenschaften, die nicht in IObj sind .. Bitte korrigieren Sie mich, wenn ich falsch liege ... Anyways letme versuchen Sie dies ... Vielen Dank für die Hilfe :-) – user1312242

+0

In der WCF Operation Contract, was Sie tun sollten, ist Überprüfe und werfe das Objekt für jeden Typ. Auf diese Weise erhalten Sie ComputerObject und nicht IObj. Aber ja, für 25 verschiedene Typen könnte diese Überprüfung einen zusätzlichen Aufwand bedeuten. – Krishna

Verwandte Themen