2012-07-18 11 views
9

Mam niestandardowy serwer HTTP zbudowany w języku C#, który akceptuje żądania usług REST i odpowiada za pomocą XML lub JSON (w zależności od tego, co potrzeby klienta). Usługi REST są definiowane w środowisku wykonawczym z konfiguracji opartej na bazie danych, różnią się znacznie pod względem parametrów wejściowych i typów danych wyjściowych, a także sprawnie pracują podczas produkcji.Tworzenie i prezentowanie usługi SOAP i jej WSDL dynamicznie w języku C# (z niestandardowym detektorem TCP!)

Chciałbym jednak dodać dostęp SOAP do tych samych usług, z odpowiednimi plikami WSDL. Ponieważ dostępne usługi nie są zakodowane, to znaczy:

  • Publikowanie WSDL wygenerowany przy starcie z definicjami metoda w bazie
  • parsowania przychodzące żądania SOAP, mapowanie ich do tych definicji i upewniając wnioski są zgodne z podpisem metody przed zabiegiem im
  • gdy odpowiedź jest obsługiwane, tworząc spotkanie odpowiedzi SOAP WDSL powrotu Wyniki

dokumentacja MS (i Google) dokumentów za pomocą Visual Studio do generowania stron internetowych servi cs (i WSDL) w czasie projektowania, eksponowanie rzeczy za pomocą WebMethods, ASP.NET MVC itd. Nie jest to tym, czego szukam, ponieważ nie istnieją definicje metod, z których można wygenerować wiązania w czasie projektowania.

Czy ktoś ma jakieś pomysły (np. Zestawy narzędzi do nieprzetworzonego parsowania SOAP) i myśli na temat generowania WSDL-ów z dynamicznie tworzonych sygnatur metod, itp.? Masz pojęcie, jak można budować takie rzeczy, jeśli nie? Staram się uniknąć ponownego wynalezienia koła, jeśli to możliwe.

PS: Najwyraźniej w systemie .NET istnieją standardowe elementy, ponieważ Visual Studio robi to za Ciebie - wszelkie pomysły na dostęp do tego na niższym poziomie w czasie wykonywania?

+1

_ "Usługi REST są zdefiniowane w środowisku wykonawczym z konfiguracji opartej na bazie danych" _ - zadrżałem, kiedy to przeczytałem. Czy to nie jest piekło konserwacji i rozwiązywania problemów? – CodeCaster

+0

Mam do czynienia z bardzo podobną sytuacją zastanawiającą się, czy zaakceptowana odpowiedź zadziałała dla ciebie –

+0

np-hard - Zrobiłem proof-of-concept i zrobiłem to, co było zamierzone. Nie wyrzuciłem jednak niczego do produkcji, ponieważ na zasadzie proszenia klientów o wdrożenie usługi REST wydawało się bardziej niezawodnym wyborem niż ręczne parsowanie i wszelkie błędy, które mogą być wprowadzone przez złożony proces ręcznego analizowania żądań SOAP. –

Odpowiedz

6

Aby utworzyć dynamicznie WSDL można użyć ServiceDescriptionReflector

Na przykład: dla klasy

public class TestWebService 
{ 
    [WebMethod] 
    public string Hello(string namex) 
    { 
     return "Hello " + namex; 
    } 
} 

można użyć tego kodu

StringWriter wr = new StringWriter(); 
var r = new System.Web.Services.Description.ServiceDescriptionReflector(); 
r.Reflect(typeof(TestWebService), "http://somewhere.com"); 
r.ServiceDescriptions[0].Write(wr); 
var wsdl = wr.ToString(); 

Ale odkąd powiedział

Publishin ga WSDL generowane w czasie wykonywania z definicji metody w bazie

trzeba stworzyć Type przy starcie

var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("MyAsm"), AssemblyBuilderAccess.Run); 
var mod = asm.DefineDynamicModule("MyModule"); 

TypeBuilder typeBuilder = mod.DefineType("TestWebService"); 

MethodBuilder mb = typeBuilder.DefineMethod("Hello", MethodAttributes.Public, CallingConventions.Standard, typeof(string), new Type[] { typeof(string) }); 
var cab = new CustomAttributeBuilder(typeof(WebMethodAttribute).GetConstructor(new Type[]{}), new object[]{}); 
mb.SetCustomAttribute(cab); 
mb.DefineParameter(1, ParameterAttributes.In, "namex"); 
mb.GetILGenerator().Emit(OpCodes.Ret); 

Type type = typeBuilder.CreateType(); 

Teraz można użyć type stworzyć WSDL

StringWriter wr = new StringWriter(); 
var r = new System.Web.Services.Description.ServiceDescriptionReflector(); 
r.Reflect(type, "http://somewhere.com"); 
r.ServiceDescriptions[0].Write(wr); 
var wsdl = wr.ToString(); 

Do czytania Żądanie i tworzenie odpowiedzi, możesz użyć Linq2Xml. Fiddler może dać pojęcie o formacie SOAP (xml) wysłanym między klientem a serwerem:

+0

To świetnie - już mam sortowanie typu, ale ServiceDescriptionReflector było dokładnie tym, czego szukałem. Dzięki! –

2

SOAP jest "po prostu" opartym na XML protokołem wymiany informacji. Wdrożenie wsparcia od podstaw byłoby męczące, ale w zasadzie nie jest skomplikowane, nie sądzę.

Oficjalne specyfikacje SOAP można znaleźć pod numerem here.

+0

To głównie nudy (i potencjalne błędy), których zamierzam uniknąć - raczej nadzieję na jakiś zestaw narzędzi do obsługi operacji SOAP itp. Wiem, że Microsoft miał swój SOAP Toolkit około 10 lat temu, ale został przestarzały na korzyść VS zarządzający wszystkim ... ale dzięki! –

2

Nie analizowania SOAP chyba rzeczywiście trzeba, niech WCF zrobić podnoszenia ciężkich dla Ciebie, wygenerować na usługi i datacontracts w kodzie C# ze swoimi definicjami i kompilacji w czasie wykonywania. Wygeneruj implementację usługi, która będzie podłączana do twojego "statycznego" kodu poprzez dobrze znany interfejs.

Dynamicznie twórz punkty końcowe z poprawnym wiązaniem dla nowych umów o świadczenie usług/umów dotyczących danych. Jeśli powiązania nie zmieniają się dynamicznie, można to zdefiniować w pliku app.config, w przeciwnym razie należy to również ustawić w środowisku wykonawczym.

dodaj punkt końcowy Mex, aby opublikować wsdl.

Dla "zbadaniu" wykorzystywać ruch przychodzący MessageInspector

własnym gospodarzem/usługę WCF SOAP w serwer HTTP przy użyciu ServiceHost ->Self Hosting WCF

Zaledwie kilka pomysłów na innym podejściu.

+0

To prawdopodobnie nie jest wystarczająco jasne z mojego pierwotnego pytania, ale zarówno umowy danych i powiązania * do * zmieniają się w czasie wykonywania, dlatego nie używam WCF. Oto przypadek użycia - serwer inny niż WCF/IIS i kontrakty, które zmieniają się (i często są też tworzone) w środowisku wykonawczym. –

+0

Jeśli zarówno kontrakty, jak i powiązania zmieniają sposób korzystania z usługi przez klientów? Czy trudno jest znaleźć usługę? –

+0

Mam dynamiczny bit kontraktu i jest on rozwiązywany przez dynamiczne generowanie kontraktów, tak jak w przypadku hostingu można samodzielnie obsługiwać usługę WCF/SOAP w serwerze HTTP za pomocą usługi ServiceHost http://msdn.microsoft.com/en-us/ library/ms730158.aspx. –

Powiązane problemy