2012-06-19 12 views
8

Utworzono usługę WWW przy użyciu WCF. Nie mogę dowiedzieć się, jak ustawić ograniczenia i ograniczenia w WSDL/XSD za pośrednictwem umowy danych.Powiąż niestandardowy plik WSDL z istniejącą usługą WCF

Co się stanie, jeśli poprawię schemat XSD2 z ograniczeniami, a następnie powiązam ten niestandardowy schemat z istniejącą usługą? Jeśli tak, w jaki sposób mogę uczynić usługę udostępnioną poprawioną WSDL? W przeciwnym razie istnieje inny sposób ustawienia metadanych usługi WCF?

Odpowiedz

1

ten wydaje się być powszechnym problemem. Metadane usługi opisuje kontrakt danych. Oznacza to, że struktura wymienianych danych, bez żadnych informacji o walidacji.

Rozwiązałem ten problem, implementując warstwę sprawdzania poprawności na warstwie usługi. Działa to następująco:

Oprócz dokumentu WSDL autor i konsument usług zgadzają się również na dopracowany XSD, który opisuje wszystkie szczegóły dotyczące walidacji oprócz samej struktury umów danych.

Każda ze stron (xml) serializuje i zatwierdza kontrakty danych na podstawie udoskonalonego XSD.

Przykładowy "pseudokod" dla metody serwisowej, która sprawdza żądanie przed XSD.

public string MyServiceMethod(MyDataType m){ 
    string s = XmlSerialize(m); 
    if(XSDValidate(s)){ 
     return ProcessRequest(m); 
    }else{ 
     return BuildErrorResponse("The request is not compliant with the contract"); 
    } 
} 

Konsument usług może również zaimplementować podobną logikę do sprawdzania poprawności danych żądania przed wysłaniem go do serwera.

+0

Dzięki. Tak właśnie podążam. Ale próbuję zrozumieć, czy jest możliwe uzyskanie schematu i jego ograniczeń z datacontract. –

3

Proszę nie mylić XSD i WSDL - this is totally different things

Według zapytanie - spróbuj użyć RiaServices. To pozwoli Ci napisać taki kod jak

public class Meeting 
{ 
    [Key] 
    public int MeetingId { get; set; } 

    [Required] 
    public DateTime Start { get; set; } 

    [Required] 
    public DateTime End { get; set; } 

    [Required] 
    [StringLength(80, MinimumLength = 5)] 
    public string Title { get; set; } 

    public string Details { get; set; } 

    [Required] 
    [RegularExpression(@"\d{1,3}/\d{4}", 
    ErrorMessage = "{0} must be in the format of 'Building/Room'")] 
    public string Location { get; set; } 

    [Range(2, 100)] 
    [Display(Name = "Minimum Attendees")] 
    public int MinimumAttendees { get; set; } 

    [Range(2, 100)] 
    [Display(Name = "Maximum Attendees")] 
    public int MaximumAttendees { get; set; } 
} 

co wiem, jedynym sposobem na poprawę WSDL z więzów i ograniczeń jest oznaczyć klas DataContract z ograniczyć atrybuty (fix mi, jeśli to nieprawda)

+0

Dzięki za wyjaśnienie. Wygląda na to, że RIAServices są rozwiązaniem, którego szukałem. Czy klient inny niż MS może spożywać RIAServices? –

+1

RiaServices zaprojektowane specjalnie dla kompleksowych rozwiązań Silverlight i ASP.NET. Nie oznacza to odrzucenia możliwości wykorzystania RiaServices przez PHP lub Javę, ale możesz znaleźć wiele pułapek i pułapek w ten sposób –

1

Zasadniczo mają dwa sposoby tworzenia usługa: najpierw

  1. kod. Tworzysz klasę i oznaczysz ją jako klasę datacractów plus kilka dodatkowych atrybutów. Podczas kompilowania tego WSDL twojej usługi internetowej zostanie wygenerowany z twojej klasy. Jest to szybka metoda i często zapewnia wystarczająco dobrą kontrolę nad WSDL.

  2. Schemat pierwszy. Użytkownik tworzy WSDL ręcznie i używa narzędzia (na przykład WSCF.Blue lub) do wygenerowania klasy datacontract z pliku WSDL. Zapewni to pełną kontrolę nad schematem WSDL, ale z mojego doświadczenia wynika, że ​​więcej pracy wymaga utworzenie WSDL niż klasy datacontract.

+0

Dobra uwaga. Mam kodowane firty.Czy możliwe jest ukształtowanie datacontract w celu ustawienia ograniczeń WSDL? –