Jak połączyć się z serwisem WCF?

Jak połączyć się z serwisem WCF?
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:8 dni
  • Postów:2512
0

Odpytuję sobie serwis (nie mój) używając przeglądarki - mam też dokumentację.

Chciałbym jednak podłączyć się "normalnie" do serwisu i odpalać metody. Zwykle robi się tak, że z menu kontekstowego wybiera się "Add Service Reference" i wklepuje adres. Jednakże w moim przypadku visual dostaje 400 Bad Request gdy próbuje uzyskać metadane.

Próbowałem połączyć się po HTTP i deserializować przez XmlSerializer oraz DataContractSerializer, ale xml który dostaję jest tak pokręcony, że co chwila mam jakieś problemy. A ponieważ ten serwis jest u mnie lokalnie i mam dostęp do jego dllek, próbowałem deserializować z użyciem "ich" typów. Bez powodzenia. Jakie to są problemy? W skrócie jest metoda serwisu:

Kopiuj
    [OperationContract]
    [XmlSerializerFormat]
    [FaultContract(typeof (StandardFault))]
    [WebGet(UriTemplate = "Doors?sdKey={sdKey}")]
    List<LightComponent<Door>> GetDoors(string sdKey);

Typ LightComponent<> implementuje IXmlSerializable

Xml jaki to wypluwa wygląda mniej więcej tak:

Kopiuj
<ArrayOfLightComponentOfDoor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <LightComponentOfDoor>
        <Session>OperatorSession</Session>
        <ID>424</ID>
        <Description>Controller #1 Door #1 (01.01)</Description>
        <Object>12</Object>
        <Owner>423</Owner>
        <item>
            <key>
                <string>DESCRIPTION2</string>
            </key>
            <value>
                <SmartLinkDataValue>
                    <Value>Controller #1 Door #1</Value>
                </SmartLinkDataValue>
            </value>
        </item>
        <item>
            <key>
                <string>ELEVATORCAB</string>
            </key>
            <value>
                <SmartLinkDataValue>
                    <Value>0</Value>
                </SmartLinkDataValue>
            </value>
        </item>
    </LightComponentOfDoor>
</ArrayOfLightComponentOfDoor>

Jeżeli próbuję to deserializować DataContractSerializer to wywala się na tym, że obiekt ten nie jest we właściwym namespace, albo nie wie co to jest <string xmlns="....">, bo nie używa metody ReadXml interfejsu IXmlSerializable.

Jeżeli próbuję użyć XmlSerializer to znów nie rozpoznaje elementu ArrayOfLightComponentOfDoor - to jest, jak mi się wydaje, element typowy dla DataContractSerializer

Wygląda to jakby było pomieszanie serializacji DataContractSerializer i XmlSerializer. Czegoś tu po prostu chyba nie rozumiem. Czy ktoś zna temat i może mi przybliżyć od której strony się do tego zabrać?

Mam nadzieję, że przedstawiłem problem dość jasno.

edytowany 3x, ostatnio: Sarrus
DibbyDum
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Polska, Kraków
0

A zwykłe zapisanie wsdla na dysku i później standardowo Add Service Reference nie działa?


Yubby dibby dibby dibby dibby dibby dibby dum..
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:8 dni
  • Postów:2512
0

wsdla nie mam właśnie

BF
  • Rejestracja:ponad 12 lat
  • Ostatnio:22 dni
  • Postów:67
0
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:8 dni
  • Postów:2512
0

Hmm jutro spróbuję.

Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:8 dni
  • Postów:2512
0

Zrobiłem tak:

Kopiuj
        static void Main(string[] args)
        {
            var myBinding = new WebHttpBinding();
            var myEndpoint = new EndpointAddress("http://localhost/SmartService");
            var factory = new ChannelFactory<ISmartService>(myBinding, myEndpoint);
            factory.Endpoint.Behaviors.Add(new WebHttpBehavior());

            ISmartService client = null;

            client = factory.CreateChannel();
            client.Login(username, password);
.....

Dostaję taki oto wyjątek:

Kopiuj
System.InvalidOperationException: Dokument XML zawiera błąd (1, 12797). ---> System.ArgumentException: Nie można odnaleźć metody set właściwości.
   w System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   w System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)
   w Kantech.SmartLinkSDK.DataComponent.CreateFromXML(XElement xmlElement, Object ObjectToBuild)
   w Kantech.SmartLinkSDK.DataComponent.ReadXml(XmlReader reader)
   w System.Xml.Serialization.XmlSerializationReader.ReadSerializable(IXmlSerializable serializable, Boolean wrappedAny)
   w Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read115_Operator()
   w Microsoft.Xml.Serialization.GeneratedAssembly.OperatorSerializer.Deserialize(XmlSerializationReader reader)
   w System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)

Po prostu bosko. Od której strony nie wezmę się za ten serwis dostaję jakimś syfem w twarz.

edytowany 3x, ostatnio: Sarrus

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.