Использование .NET WebService с использованием клиента C ++

0

У меня есть веб-сервис, который запрашивает БД и возвращает результаты этих запросов. Однако вебсервис не имеет прямого доступа к БД, вместо этого он запрашивает его, используя созданную пользователем библиотеку, с определенными методами для извлечения пользователей, имен и т.д. Я включил библиотеку в проект webservice, выбрав add> reference и Я не могу компилировать ошибки или предупреждения на свой код webservice. Я создал клиентские библиотеки, используя svcutil.exe и wsutil.exe, и все прошло нормально, без предупреждений. На моем клиентском коде я получаю сообщение "Была ошибка обработки tempuri.org.xsd", "Ошибка генерации кода для DataSet". "И" Невозможно преобразовать входной XML файл в DataSet. Вложенная таблица "Utilizador", которая наследует соответствующее пространство имен не может иметь несколько таблиц в разных пространствах имен ". Последняя ошибка была переведена на португальский язык, и я сделал все возможное, чтобы перевести ее на английский, поэтому YMMV... "Utilizador" - это имя таблицы в моей БД и имя класса в библиотеке, которая обращается к БД. Я использую этот код для использования WebService:

#include "stdafx.h" 
#include "WebServices.h" 
#include "schemas.microsoft.com.2003.10.Serialization.xsd.h" 
#include "tempuri.org.xsd.h" 
#include "tempuri.org.wsdl.h"
#include <string> 
#include <iostream> 
#include <stdlib.h> 

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    unsigned int *listSize;
    Utilizador **arrayUser;
    HRESULT hr = ERROR_SUCCESS;
    WS_ERROR* error = NULL;
    WS_HEAP* heap = NULL;
    WS_SERVICE_PROXY* proxy = NULL;
    WS_ENDPOINT_ADDRESS address = {};
    WS_STRING url= WS_STRING_VALUE(L"http://localhost:51765/Graph4Social.svc");
    address.url = url;
    hr = WsCreateHeap(2048, 512, NULL, 0, &heap, error);
    WS_HTTP_BINDING_TEMPLATE templ = {};
    //criação do proxy para o serviço 
    //hr = BasicHttpBinding_IGraph4WebService_CreateServiceProxy(&templ, NULL, 0, &proxy, error);
    //WsCreateServiceProxy(&templ, NULL, 0, &proxy, error);
    hr = BasicHttpBinding_IGraph4Social_CreateServiceProxy(&templ, NULL, 0, &proxy, error);
    hr = WsCreateServiceProxy(WS_CHANNEL_TYPE_REQUEST,WS_HTTP_CHANNEL_BINDING,NULL,NULL,0,NULL,0,&proxy,error);
    hr = WsOpenServiceProxy(proxy,&address,NULL,error);

    hr = BasicHttpBinding_IGraph4Social_getUserList(proxy,listSize,&arrayUser,heap, NULL,0, NULL,error);

    for (unsigned int i = 0; i < *listSize; i++)
        cout << "ID Utilizador: " + arrayUser[i]->idUtilizador;
    return 0;
}

Это код WebService для интерфейса:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using TM_TDG.WithDataSets.BLL;
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IGraph4Social" in both code and config file together.
[ServiceContract]
public interface IGraph4Social
{
    [OperationContract]
    IList<Utilizador> getUserList();
}

И это код для класса, который реализует интерфейс:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using TM_TDG.WithDataSets.BLL;
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Graph4Social" in code, svc and config file together.
public class Graph4Social : IGraph4Social
{
    public IList<Utilizador> getUserList()
    {
        RedeSocial rede = RedeSocial.getRedeSocial();
        IList<Utilizador> userList = rede.getUserList(true); //so queremos os utilizadores activos
        return userList;
    }
}

Я ошибся в этой ошибке и не могу найти ответ. Надеюсь, кто-то может помочь мне в этом, так как я много лет простаивал по этому вопросу!

Благодарю!

Теги:
web-services

1 ответ

0

Я на самом деле решил эту последнюю ночь просто случайно! Оказывается, я размещал все файлы, созданные svcutil.exe и wsutil.exe на странице проекта (включая.xsd и.wsdl, сгенерированные svcutil.exe). Я также добавлял все элементы в проект visual studio, хотя, очевидно, я включал только файлы.h. Я думал, что компилятор только посмотрел на.h и соответствующие файлы.c, но, оказывается, он тоже смотрел на.xsd и.wsdl. Когда я удалял эти файлы, компилятор работал безупречно! Итак, PEBKAC... Не знаю, связано ли это с Visual Studio или если это поведение можно воспроизвести с помощью gc++, например.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню