8

Ich entwickle (neu schreiben auf WCF) eine Datei Parsen Web-Service zu akzeptieren string[] und Rückkehr ISection[] aber eigentlich ist das eine Reihe von verschachtelten Schnittstellen erben:Daten Kontrakt Bekannte Typen und eine Reihe von Schnittstellen miteinander

namespace Project.Contracts // Project.Contracts.dll 
{ 
    public interface ISection { } 

    public interface ISummarySection : ISection { } 

    public interface IDataSection : ISection { } 
} 

und Klassen:

namespace Project.Format.A // Project.Format.A.dll 
{ 
    [DataContract] 
    public class SummarySectionFormatA : ISummarySection { } 

    [DataContract] 
    public class DataSectionFormatA : IDataSection { } 
} 

Service-Schnittstelle und deren Umsetzung:

[ServiceContract] 
public interface IService // Project.Contracts.dll 
{ 
    ISection[] Parse(string format, string[] data); 
} 

[ServiceKnownType(typeof(SummarySectionFormatA))] // tried this also 
[ServiceKnownType(typeof(DataSectionFormatA))] 
public class Service : IService // Project.Service.dll 
{ 
    public ISection[] Parse(string format, string[] data) 
    { 
     return Factory.Create(format).Parse(data); 
    } 
} 

Ich versuchte declaredTypes auf beide Server und Clients zu konfigurieren:

<system.runtime.serialization> 
    <dataContractSerializer> 
    <declaredTypes> 
     <add type="Project.Contracts.ISumarySection, Project.Contracts"> 
     <knownType type="Project.Format.A.SummarySectionFormatA, Project.Format.A" /> 
     </add> 
     <add type="Project.Contracts.IDataSection, Project.Contracts"> 
     <knownType type="Project.Format.A.DataSectionFormatA, Project.Format.A" /> 
     </add> 
    </declaredTypes> 
    </dataContractSerializer> 
</system.runtime.serialization> 

aber immer noch die gleiche Fehlermeldung erhalten:

"Type 'DataSectionFormatA' with data contract name 'DataSection:http://schemas.example.com/Parse' is not expected.

oder

The underlying connection was closed: The connection was closed unexpectedly.

ich dekorieren kann nicht Schnittstellen mit Knowntype Weil Contracts-Projekte keine Format-Projekte referenzieren und die Referenzierung das Design bricht. Deshalb möchte ich config verwenden.

+0

Können Sie Ihre Serviceverträge bitte posten –

+0

@hugh: Sicher, aktualisiert. – abatishchev

Antwort

0

Der Versuch, diese Arbeit zu machen:

[KnownType("GetKnownType")] 
public class Section 
{ 
    static Type[] GetKnownType() 
    { 
     return new[] 
     { 
      Type.GetType("Project.Format.A.DataSectionFormatA, Project.Format.A") 
     }; 
    } 
} 

aber scheint, dass sowohl Server als auch Client Project.Format.A.dll verweisen muss Mach es funktioniert (Methode nicht Null zurück)

2

Werfen Sie einen Blick auf den Code unten

[ServiceContract] 
[ServiceKnownType(typeof(SummarySectionFormatA))] 
[ServiceKnownType(typeof(DataSectionFormatA))] 
public interface IService {} 

public class Service : IService {} 
+0

Ok, ich habe es. Sie schlagen also vor, die Schnittstelle (Servicevertrag) zu dekorieren, aber nicht die Implementierung. Aber wie ich im unteren Teil meiner Frage erwähnt habe, möchte ich es nicht tun, weil die Schnittstelle in die Contracts.dll eingefügt wird, die keine anderen projekteigenen DLLs referenziert, und sie kann einen zirkulären Verweis nicht verhindern. Ich möchte eine Konfiguration verwenden. – abatishchev

1

Ich glaube, Sie sollten Ihre Implementierung ein wenig ändern ... werfen Sie einen Blick auf diese question und sehen, ob es hilft.

+0

Rechts. Meine Hauptfrage ist warum funktioniert nicht config. Scheint, weil auf das Projekt nicht verwiesen wird (was ich vermeiden möchte) und Type.GetType() gibt null zurück. Müssen die Umsetzung tatsächlich ändern. – abatishchev

+0

Richtig! Problem ist Service ist abhängig von etwas, das unbekannt ist ... Auch ich möchte die Verwendung von Schnittstelle für Datenverträge in Frage, warum beabsichtigen Sie, das zu abstrahieren. Ich würde empfehlen, es als Beton zu machen oder auch an diesen Winkel zu denken. – Wali

+0

Es war das ursprüngliche Design und es funktionierte gut als Teil einer Web-App. Jetzt trennen wir die Parsing-Logik von der App in einen dedizierten Web-Service (WCF) und versuchen dies zunächst ohne größere Designänderungen. – abatishchev

Verwandte Themen