2016-07-15 1 views
0

Ich habe einen WCF-Dienst mit einer Methode, die von mehreren Web-API-Controllern wie im folgenden Code aufgerufen wird.Wie jeder Objekttyp als Eingabeparameter mit nur 1 Methode übergeben werden kann

public string Print(PdfPrinterRequest _request) 
    { 
     PdfPrinterService.PdfPrinterClient _Client = new PdfPrinterService.PdfPrinterClient(); 
     PdfPrinterResponse _response = new PdfPrinterResponse(); 
     return _Client.Print(_request.Document, out _pdfResponse); 
    } 

PdfPrinterRequest (Document-Klasse) ist die Einheit, die ich das Bestehen der Antwortnachricht von WCF service.Currently die Dokumentenklasse hält einige Eigenschaften (Anforderungs-Header) zu erhalten. Ich möchte dieselbe Druckmethode von einer anderen API aufrufen und den Typ "Kunde" an den WCF-Dienst übergeben. Wie kann ich das erreichen? Kann mir bitte jemand die richtige Umsetzung vorschlagen?

Unten ist mein WCF-Service-Code,

public class PdfPrinterService : IPdfPrinter 
    { 
     public PdfPrinterResponse Print(PdfPrinterRequest request) 
     { 
     return PdfPrinterFacade.PrintPdf(request); 
     } 
    } 

    public static PdfPrinterResponse PrintPdf(PdfPrinterRequest request) 
    { 
     PdfPrinterResponse response = new PdfPrinterResponse(); 
     //Process the request and send back the response message 
    } 

    [MessageContract] 
    public class PdfPrinterRequest 
    { 
    private Document _document; 

    [MessageBodyMember] 
    public Document Document 
    { 
     get { return _document; } 
     set { _document = value; } 
    } 
    } 

Wie ein dynamisches Klasse-Objekt als Parameter anstelle von PdfPrinterRequest passieren, die nicht gebunden ist, nur eine Art (Dokument)? Bitte vorschlagen.

Danke,

+0

Try Methode Überlastungen zu verwenden, wenn dies möglich ist. – ViRuSTriNiTy

+0

Haben Sie eine gemeinsame Methode in allen Objekten wie 'GetRepsonse()', oder können Sie sie zumindest so ändern, dass sie eine solche Methode haben? – user3185569

+0

@ViRuSTRiNiTy, ich kann Überladungen haben, aber weiß nicht, wie viele Methoden ich am Ende habe, lieber hätte ich gerne eine Methode, um jede Art von Klassenobjekt zu akzeptieren. Danke –

Antwort

0

Wenn dieser Dienst zusammenarbeiten, nicht benötigen, können Sie zu NetDataContractSerializer wechseln können, die vollständige .NET-Typ Informationen verwendet und ist in der Lage viele weitere Arten (aber nicht jede Typ zu serialisiert - das ist nicht möglich).

Besorgen Sie sich die UseNetDataContractSerializerAttribute von this answer und gelten wie folgt:

[UseNetDataContractSerializer] 
public class PdfPrinterService : IPdfPrinter 
{ 
    public PdfPrinterResponse Print(PdfPrinterRequest request) 
    { 
    return PdfPrinterFacade.PrintPdf(request); 
    } 
} 

[MessageContract] 
public class PdfPrinterRequest 
{ 
    [MessageBodyMember] 
    public object Document { get; set; } 
} 
+0

In der obigen Druckmethode übergebe ich jetzt festen Typ 'PdfPrinterRequest', lieber würde ich jede Art von Anfrage übergeben. Bitte schlagen Sie vor, wie man das macht? –

+0

Das ist eine ganz andere Frage. Lassen Sie mich zunächst einmal sagen, dass WCF nicht so verwendet werden soll - Sie sollten separate Dienstmethoden für verschiedene Operationen erstellen. Sonst würden Sie am Ende selbst die Arbeit des WCF Dispatcher erledigen. Sie können entweder die obige Methode verwenden und jedes Objekt, das Sie drucken möchten, in die 'Dokument'-Eigenschaft stellen - oder von' MessageContract' zu 'DataContract' wechseln, wodurch Vererbung ermöglicht wird. Dann können Sie eine 'Print (BaseRequest request)' Methode erstellen. Sie müssen auch '[KnownType]' in der Basisklasse für jeden der übernommenen Anfragetypen definieren. –

+0

Ok, ich habe MessageContracts in DataContract geändert und ich habe die Document-Klasseneigenschaft aus der PdfPrinterRequest-Klasse entfernt und anforderungsbezogene Eigenschaften eingefügt. Kannst du das ganze Beispiel hier zitieren? –

Verwandte Themen