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

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:

    [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:

<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.

0

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

0

wsdla nie mam właśnie

0

Skoro masz dostęp do DLL'ek to nie rozumiem w czym problem?

http://stackoverflow.com/questions/2943148/how-to-programmatically-connect-a-client-to-a-wcf-service

B.

0

Hmm jutro spróbuję.

0

Zrobiłem tak:

        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:

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1