locked
Generisches Dictionary per XML an WCF-Dienst senden? RRS feed

  • Frage

  • Hallo,

    ich habe einen WCF-Dienst, der über verschiedene Endpunkte sowohl per JSON, XML und SOAP erreichbar ist. Eine neue Methode dieses Dienstes soll nun ein generisches Dictionary<int, string> übergeben bekommen:

    [OperationContract]
    [WebInvoke]
    GetMoves_Result[] GetMoves(DateTime startDate, DateTime endDate, Dictionary<int, string> filters);
    

    Ich versuche nun, per Fiddler's RequestBuilder die Aufrufe zu simulieren. Für die JSON-Variante ist mir dies auch gelungen:

    {
      "startDate": "\/Date(1271430082607+0200)\/", 
      "endDate": "\/Date(1272299800000+0200)\/",
      "filters":
    	[
    		{ "Key": 1, "Value":"bla"},
    		{ "Key": 2, "Value":"blub"}
    	]
    }
    
    
    Leider ist es mir trotz intensiver Recherche im Web nicht gelungen, das XML-Gegenstück dazu zu finden. Ich habe mir zum Testen eine weitere Methode geschrieben, die ein solches Dictionary zurückliefert, und habe folgendes mal ausprobiert:

    <GetMoves xmlns="http://tempuri.org/">
     <startDate>2010-04-01</startDate>
     <endDate>2010-04-30</endDate>
     <filters>
      <KeyValueOfintstring>
       <Key>1</Key>
       <Value>bla</Value>
      </KeyValueOfintstring>
      <KeyValueOfintstring>
       <Key>2</Key>
       <Value>blub</Value>
      </KeyValueOfintstring>
     </filters>
    </GetMoves>
    
    

    Die "einfachen" Parameter wie StartDate und EndDate kommen richtig an, aber das Dictionary ist in der aufgerufenen Service-Method einfach leer.

    Kann mir jemand sagen, wie der Body des HTTP-Post Requests aussehen muss, damit es funktioniert?

    Mittwoch, 15. September 2010 12:59

Antworten

  •  Hallo,

    Kann mir jemand sagen, wie der Body des HTTP-Post Requests aussehen muss, damit es funktioniert?

    Da Du schon Fiddler benutzt: Warum ziehst Du nicht einfach ein entspr. Session-Eintrag auf den Request Builder-Reiter von Fiddler? - Bei mir sieht das Ergebnis dann so aus (mit basicHttpBinding u. security mode="None"):

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
     <s:Body>
      <GetMoves xmlns="http://tempuri.org/">
       <startDate>2010-01-01T00:00:00</startDate>
       <endDate>2010-02-01T00:00:00</endDate>
       <filters xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:KeyValueOfintstring>
         <a:Key>1</a:Key>
         <a:Value>one</a:Value>
        </a:KeyValueOfintstring>
        <a:KeyValueOfintstring>
         <a:Key>2</a:Key>
         <a:Value>two</a:Value>
        </a:KeyValueOfintstring>
       </filters>
      </GetMoves>
     </s:Body>
    </s:Envelope>
    
    

     

    Gruß
    Marcel

    • Als Antwort markiert __it__ Donnerstag, 16. September 2010 06:51
    Mittwoch, 15. September 2010 20:32

Alle Antworten

  •  Hallo,

    Kann mir jemand sagen, wie der Body des HTTP-Post Requests aussehen muss, damit es funktioniert?

    Da Du schon Fiddler benutzt: Warum ziehst Du nicht einfach ein entspr. Session-Eintrag auf den Request Builder-Reiter von Fiddler? - Bei mir sieht das Ergebnis dann so aus (mit basicHttpBinding u. security mode="None"):

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
     <s:Body>
      <GetMoves xmlns="http://tempuri.org/">
       <startDate>2010-01-01T00:00:00</startDate>
       <endDate>2010-02-01T00:00:00</endDate>
       <filters xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:KeyValueOfintstring>
         <a:Key>1</a:Key>
         <a:Value>one</a:Value>
        </a:KeyValueOfintstring>
        <a:KeyValueOfintstring>
         <a:Key>2</a:Key>
         <a:Value>two</a:Value>
        </a:KeyValueOfintstring>
       </filters>
      </GetMoves>
     </s:Body>
    </s:Envelope>
    
    

     

    Gruß
    Marcel

    • Als Antwort markiert __it__ Donnerstag, 16. September 2010 06:51
    Mittwoch, 15. September 2010 20:32
  • Hallo Marcel,

    danke für deine Antwort! Der XML-Namespace xmlns:a="..." ist, was den Unterschied ausmacht. Gibt's dazu irgend eine Doku? Welche anderen spannenden Namespaces gibt es evtl. noch?

    Da Du schon Fiddler benutzt: Warum ziehst Du nicht einfach ein entspr. Session -Eintrag auf den Request Builder -Reiter von Fiddler?

    Na darauf hätte ich kommen können ;-) Ich war mir nur nicht sicher, ob die SOAP-Variante mit der XML-Variante übereinstimmt, um die es mir ja hauptsächlich ging.

    Solved!

     

    Donnerstag, 16. September 2010 06:51
  • Der XML-Namespace xmlns:a="..." ist, was den Unterschied ausmacht. Gibt's dazu irgend eine Doku? Welche anderen spannenden Namespaces gibt es evtl. noch?

    Hallo,

    Du kannst Dir unter [Adresse:Port]/[Dienst]/?wsdl alle Schemen/Namespaces ansehen, die von Deinem Dienst benutzt werden. Das könnte im o.g. Fall dann etwas so aussehen:

    <wsdl:types>
    <xsd:schema targetNamespace="http://tempuri.org/Imports">
     <xsd:import schemaLocation="http://[Adresse:Port]/[Service]/?xsd=xsd0" namespace="http://tempuri.org/" /> 
     <xsd:import schemaLocation="http://[Adresse:Port]/[Service]/?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> 
     <xsd:import schemaLocation="http://[Adresse:Port]/[Service]/?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/[ns]" /> 
     <xsd:import schemaLocation="http://[Adresse:Port]/[Service]/?xsd=xsd3" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" /> 
    </xsd:schema>
    </wsdl:types>
    
    

     

    Gruß
    Marcel

    Donnerstag, 16. September 2010 08:24