Клиент C# для OMElement из веб-службы Axis2

У меня есть веб-служба Axis2, реализованная с использованием AXIOM, которая возвращает список String.

Фрагмент кода клиента на Java, который работает, выглядит следующим образом.

   // * send SOAP message
   sender.fireAndForget( requestObject );

   // * get response
   OMElement reponseObject = sender.sendReceive( requestObject );

    // * iterator for String
    Iterator elementItr = reponseObject.getChildElements();

     while(elementItr.hasNext())
    {
         OMElement element = (OMElement)elementItr.next();

         // * print each message
         System.out.println( element.getText() );
    }

Мне нужно реализовать клиент С#, который использует службу, как указано выше.

Мне удалось протестировать клиент С#, который возвращает один объект String, как показано ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HDMClient.hdssWS;

namespace HDMClient
{
    class Program
    {
        static void Main(string[] args)
        {
        HDMClient.hdssWS.StockQuoteServicePortTypeClient client = new hdssWS.StockQuoteServicePortTypeClient("StockQuoteServiceHttpSoap11Endpoint");

        client.update("apple", 1232.123);
        Console.WriteLine(client.getPrice("apple"));
        Console.ReadLine();   
        }
    }
}

Тип сообщения в app.config — «MTOM», а конфигурация в axis2.xml в WAS установлена ​​на

    <parameter name="enableMTOM">true</parameter>

Я могу иметь дело с одним ответом String.

Но я понятия не имею, как работать со списком String, как указано выше.

Я искал похожие случаи

но похоже, что это не тот случай, с которым я столкнулся.

Есть ли у вас какие-либо идеи?


person Calia Kim    schedule 05.01.2013    source источник


Ответы (1)


Многочасовые поиски привели к некоторому обходному пути, в котором не используется AXIOM, а используется POJO.

веб-сервис.

А вот и служба, которая возвращает список строк.

package samples.quickstart.service.pojo;

import java.util.HashMap;
import java.util.ArrayList;
import java.util.List;

 public class StockQuoteService {
    private HashMap map = new HashMap();

    public List<String> getPrice(String symbol, int number) {
    Double price = (Double) map.get(symbol);

    List<String> retValue = new ArrayList<String>();

    retValue.add("1");
    retValue.add("2");

    return retValue;
}

public void update(String symbol, double price) {
    map.put(symbol, new Double(price));
}
}

И в Reference.cs в проекте .Net я добавил

[System.ComponentModel.EditorBrowsableAttribute        (System.ComponentModel.EditorBrowsableState.Advanced)]
    HDMClient.hdssWS.getPriceResponse HDMClient.hdssWS.StockQuoteServicePortType.getPrice(HDMClient.hdssWS.getPriceRequest request)
    {
        return base.Channel.getPrice(request);
    }

    public string [] getPrice(string symbol, int number)
    { 
        HDMClient.hdssWS.getPriceRequest inValue = new HDMClient.hdssWS.getPriceRequest();
        inValue.symbol = symbol;
        inValue.number = number;
        HDMClient.hdssWS.getPriceResponse retVal = ((HDMClient.hdssWS.StockQuoteServicePortType)(this)).getPrice(inValue);
        return retVal.@return;
    }

    [System.ComponentModel.EditorBrowsableAttribute    (System.ComponentModel.EditorBrowsableState.Advanced)]
    void HDMClient.hdssWS.StockQuoteServicePortType.update(HDMClient.hdssWS.update request)
    {
        base.Channel.update(request);
    }

    public void update(string symbol, double price)
    {
        HDMClient.hdssWS.update inValue = new HDMClient.hdssWS.update();
        inValue.symbol = symbol;
        inValue.price = price;
        ((HDMClient.hdssWS.StockQuoteServicePortType)(this)).update(inValue);
    }

Если вы посмотрите на код, я не использовал List или ArrayList в Generic из C#.

Вместо этого возвращаемое значение представляет собой массив строк. -> (общедоступная строка [] getPrice (символ строки, целое число))

И код клиента С# выглядит так, как показано ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HDMClient.hdssWS;

namespace HDMClient
{
class Program
{
    static void Main(string[] args)
    {
        HDMClient.hdssWS.StockQuoteServicePortTypeClient client = new hdssWS.StockQuoteServicePortTypeClient("StockQuoteServiceHttpSoap11Endpoint");

        client.update("apple", 1232); 

        string [] result = client.getPrice("apple", 12);

        for (int i = 0; i < result.Length; i++) 
        {
            Console.WriteLine(result[i]);
        }

    }
}
}

И это сработало, как и ожидалось, показав мне 1, 2 в строковом типе в консоли.

Любой, кто хочет внедрить веб-службу Axis2 для использования клиентом .Net и

нужен сервис, который возвращает список примитивных типов данных, может относиться к моему случаю.

Хотя есть несколько примеров, в которых вывод является просто примитивным типом, а не универсальным, как

Список на Яве.

person Calia Kim    schedule 06.01.2013