valor referencia recibir por pasar parametros parametro objetos objeto formularios entre como clases clase asignar c# web-services soap wsdl affiliate

c# - referencia - Pasar parámetro como objeto



pasar variables entre clases c# (3)

Parece que el problema es la diferencia entre la matriz en PHP y C #. En PHP, es un par de valores clave. ¿Qué tal su aspecto en la clase generada que se creó a partir de la wdsl? Aquí hay una línea a una pregunta de SO que está relacionada con su problema. C # equivalente a php asociative array Una respuesta dice que intente Dictionary<String, String> . Tal vez valga la pena intentar usar KeyValuePair<String, String> pasado como una matriz de objetos.

KeyValuePair<String, String> parm = new KeyValuePair<String, String>("apiKey","******"); var response = service.getTransactions(new object[] { parm });

Deseo usar esta API con la aplicación ac #: http://www.affjet.com/2012/11/26/4-4-affjet-api/#more-3099

Después de agregar el wsdl a mi proyecto, escribí este código simple: (getTransactions obtiene un objeto [] @params y devuelve una cadena)

Ws_ApiService service = new Ws_ApiService(); string apiKey = "*************"; var response = service.getTransactions(new object[] { apiKey });

Probé algunas formas más, pero no pude obtener una respuesta correcta, intenté:

var response = service.getTransactions(new object[] { "apiKey:****"});

y

var response = service.getTransactions(new object[] { "apiKey","******"});

Aquí está el código php que hace lo mismo desde sus documentos:

<?php $nameSpace = "https://secure.affjet.com/ws/api"; //Creating AffJet client for SOAP $client = new SoapClient($nameSpace."?wsdl"); $pageNumber = 0; //Setting up parameters $params = array(); $params["apiKey"] = "MY_API_KEY"; //Value for parameters (optional) //$params["networkId"] = array(1,2); //$params["pageNumber"] = 0; //$params["pageSize"] = 10; //Making Request $response = $client->getNetworks($params); //XML to SimpleXMLElement Object $xmlResponse = new SimpleXMLElement($response); if ($xmlResponse->success == "true"){ while (isset($xmlResponse->dataList->data)) { //Iterate the results foreach ($xmlResponse->dataList->data as $data){ var_dump(xml2array($data)); } //Requesting next page of data $pageNumber++; $params["pageNumber"] = $pageNumber; //Making Request $response = $client->getNetworks($params); //XML to SimpleXMLElement Object $xmlResponse = new SimpleXMLElement($response); } } else { //Error somewhere echo $xmlResponse->errorMessage; } /** * Transforms the object SimpleXmlElement into an array, easier to handle */ function xml2array($xml) { $arr = array(); foreach ($xml as $element) { $tag = $element->getName(); $e = get_object_vars($element); if (!empty($e)) { $arr[$tag] = $element instanceof SimpleXMLElement ? xml2array($element) : $e; } else { $arr[$tag] = trim($element); } } return $arr; } ?>

Esta fue la respuesta a lo que intenté:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://secure.affjet.com/ws/api" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns1:getTransactionsResponse> <return xsi:type="xsd:string"> &lt;response&gt;&lt;success&gt;false&lt;/success&gt;&lt;errorMessage&gt; API Key not provided&lt;/errorMessage&gt;&lt;dataList&gt; &lt;/dataList&gt;&lt;/response&gt; </return> </ns1:getTransactionsResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

puedes ver :

API Key not provided

Y la respuesta debería ser algo como esto:

<response> <success>true</success> <errorMessage></errorMessage> <dataList> <data> <date>2012-11-05 15:02:41</date>//Transaction Date <amount>81.67</amount> <commission>15.86</commission> <status>confirmed</status>//Status, could be: declined, pending, confirmed or paid <clickDate></clickDate> <ip></ip> <custom_id>MyCustomId</custom_id>//Custom Id for the transactions (SID, SubId,clickRef....) <unique_id>2548462</unique_id>//Unique Id given from the network to this transaction <merchantId>1</merchantId>//Id for the Merchant on AffJet <networkId>1</networkId>//Id for the Network on AffJet </data> </dataList> </response>

todo lo que necesito suministrar es un parámetro llamado "apiKey" y su valor

EDITAR:

después de contactar con su apoyo, dijeron que la solicitud debería verse así:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://secure.affjet.com/ws/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP- ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns1:getTransactions> <params xsi:type="ns2:Map"> <item> <key xsi:type="xsd:string">apiKey</key> <value xsi:type="xsd:string">YOURAPIKEY</value> </item> </params> </ns1:getTransactions> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

Algunas ideas ?


Profundicé un poco más en este tema fascinante y tengo que decir que trabajar con lo que equivale a una matriz asociativa es solo un problema en la implementación de .NET SOAP. Una matriz asociativa se representa como un IDictionary (por ejemplo, Hashtable), pero se niega a ser serializado (¡inténtelo!).

El código a continuación es lo más cercano que pude encontrar, y por algún motivo (¿error?) No funciona en el marco .NET, pero sí funciona en Mono.

using System; using System.IO; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; using System.Collections.Generic; using System.Text; public class Test { /* * as per http://.com/a/1072815/2348103 */ public class Item { [XmlElement(Form = XmlSchemaForm.Unqualified)] public string key; [XmlElement(Form = XmlSchemaForm.Unqualified)] public string value; } [SoapType(TypeName = "Map", Namespace = "http://xml.apache.org/xml-soap")] public class Map : List<Item> { } public static void Main() { Map map = new Map(); map.Add( new Item { key="foo", value="bar" } ); map.Add( new Item { key="quux", value="barf" } ); XmlTypeMapping mapping = (new SoapReflectionImporter()).ImportTypeMapping( map.GetType() ); XmlSerializer serializer = new XmlSerializer( mapping ); XmlTextWriter writer = new XmlTextWriter( System.Console.Out ); writer.Formatting = Formatting.Indented; writer.WriteStartElement( "root" ); serializer.Serialize( writer, map ); writer.WriteEndElement(); writer.Close(); } } /* // // does not work - but see http://msdn.microsoft.com/en-us/magazine/cc164135.aspx // public class Map : IXmlSerializable { const string NS = "http://xml.apache.org/xml-soap"; public IDictionary dictionary; public Map() { dictionary = new Hashtable(); } public Map(IDictionary dictionary) { this.dictionary = dictionary; } public void WriteXml(XmlWriter w) { w.WriteStartElement("Map", NS); foreach (object key in dictionary.Keys) { object value = dictionary[key]; w.WriteStartElement("item", NS); w.WriteElementString("key", NS, key.ToString()); w.WriteElementString("value", NS, value.ToString()); w.WriteEndElement(); } w.WriteEndElement(); } public void ReadXml(XmlReader r) { r.Read(); // move past container r.ReadStartElement("dictionary"); while (r.NodeType != XmlNodeType.EndElement) { r.ReadStartElement("item", NS); string key = r.ReadElementString("key", NS); string value = r.ReadElementString("value", NS); r.ReadEndElement(); r.MoveToContent(); dictionary.Add(key, value); } } public System.Xml.Schema.XmlSchema GetSchema() { return null; } } */

Salida de muestra de Mono:

<q1:Map xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="id1" d2p1:arrayType="Item[2]" xmlns:d2p1="http://schemas.xmlsoap.org/soap/encoding/" xmlns:q1="http://xml.apache.org/xml-soap"> <Item href="#id2" /> <Item href="#id3" /> </q1:Map> [...]

Salida de muestra de .NET:

<q1:Array xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="id1" q1:arrayType="Item[2]" xmlns:q1="http://schemas.xmlsoap.org/soap/encoding/"> <Item href="#id2" /> <Item href="#id3" /> </q1:Array> [...]


Puede usar la clase de pareja KeyValue o la clase de diccionario de la siguiente manera:

Dictionary<string, string> d = new Dictionary<string, string>(); d.Add("apiKey", "******"); var response = new object[] { d }; KeyValuePair<string, string> d = new KeyValuePair<string, string>("apiKey", "******"); var response = new object[] { d };