Solved

consuming a .net web service with C++ 6.0

Posted on 2004-08-12
5
513 Views
Last Modified: 2010-05-18
Would prefer details on using SOAP , GET , and POST to retrieve. Not asking for code (but feel  free to submit any code you so desire) just good articles and starting points.
Thanks.
0
Comment
Question by:mccainz2
5 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 11785238
Maybe http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsoap/html/understandsoap.asp ("Understanding SOAP") or http://www.microsoft.com/mind/0100/soap/soap.asp ("SOAP: The Simple Object Access Protocol") is a good point to start.
0
 
LVL 5

Author Comment

by:mccainz2
ID: 11785326
Sorry , wasnt clear.
Issue is how to consume these .net services from a vc++ 6.0 (unmanaged code) client.
I am not a C++ but rather a .net developer and I am trying to facillitate (read convince) a contractor I work with to consume my .net web service rather than relying on our current architecture for data transfer.
0
 
LVL 1

Expert Comment

by:ageraldnaveen
ID: 11785803
instead of writing your own webservices layer on the client side using SOAP,HTTP etc.,

my suggestion is...

u just develop a .Net component wrapper for your webservice.
create a CCW for your .Net component and use it in your client application..

by doing this, u are making reuse of the .Net webservices architecture. you need not write your own coding for webservices layer right?

you shall take this, if you are not very much concerned about the performance..(very much !!)
but this would be an easy solution for your problem.
0
 
LVL 5

Author Comment

by:mccainz2
ID: 11787124
My lack of c++ may be hindering me here but I simply need to know how a remote C++ 6.0 client can call a .net webservice which can respond to either SOAP,GET,or POST (BTW, this will be an https URL for the webservice). All I really need is a good article I can pass to our C++ developer that will  either (1) allow me to write a simple C++ app so as to shame him into using my webservice or (2) get him started on the correct path by showing him it is possible.

Thanks, and forgive my lack of Knowledge regarding the client side of calling webservices , especially from VC++6.0
0
 
LVL 5

Accepted Solution

by:
millsoft earned 500 total points
ID: 11787839
Hi mcCainz,

I can guarantee it's possible, since I do exactly that in my code, but my implementation uses a lot of code (including an XML generator for the SOAP request.)

However, basically, all you have to do is send XML via HTTP (or HTTPS), and retrieve the response XML and parse it.

For that, you can see the VC sample HEREX.EXE: http://download.microsoft.com/download/ie4095/hsrex/1/win98/en-us/Hsrex.exe  (C++ program posted below).

To apply this sample to your soap problem, create a file with the full XML of the SOAP request you want to send, and then modify the UseHTTPSendReqExec function to read your file and send it as the data.

Brad

#include <Windows.h>
#include <WinINet.h>
#include <stdio.h>

BOOL UseHttpSendReqEx(HINTERNET hRequest, DWORD dwPostSize);
#define BUFFSIZE 500

void main( int argc, char **argv )
{
    DWORD dwPostSize;

    if (argc < 4)
    {
        printf("Usage: Bigpost <Size> <Server> <Path>\n");
        printf("<Size> is the number of KB to POST\n");
        printf("<Server> is the server to POST to\n");
        printf("<Path> is the virtual path to POST to\n");
        exit(0);
    }

    if ( ((dwPostSize = strtoul(argv[1],NULL,10)) == 0) || (dwPostSize >= 2047999) )
    {
        printf("%s is invalid size.  Valid sizes are from 1 to 2047999\n", argv[1]);
        exit(0);
    }

    printf( "Test of POSTing %luKB with WinInet\n", dwPostSize);

    dwPostSize *= 1024;  // Convert KB to bytes

    HINTERNET hSession = InternetOpen( "HttpSendRequestEx", INTERNET_OPEN_TYPE_PRECONFIG,
        NULL, NULL, 0);
    if(!hSession)
    {
        printf("Failed to open session\n");
        exit(0);
    }


    HINTERNET hConnect = InternetConnect(hSession, argv[2], INTERNET_DEFAULT_HTTP_PORT,
        NULL, NULL, INTERNET_SERVICE_HTTP,NULL, NULL);
    if (!hConnect)
        printf( "Failed to connect\n" );
    else
    {
        HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", argv[3],
            NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0);
        if (!hRequest)
            printf( "Failed to open request handle\n" );
        else
        {
            if(UseHttpSendReqEx(hRequest, dwPostSize))
            {    
                char pcBuffer[BUFFSIZE];
                DWORD dwBytesRead;

                printf("\nThe following was returned by the server:\n");
                do
                {    dwBytesRead=0;
                    if(InternetReadFile(hRequest, pcBuffer, BUFFSIZE-1, &dwBytesRead))
                    {
                        pcBuffer[dwBytesRead]=0x00; // Null-terminate buffer
                        printf("%s", pcBuffer);
                    }
                    else
                        printf("\nInternetReadFile failed");
                }while(dwBytesRead>0);
                printf("\n");
            }
            if (!InternetCloseHandle(hRequest))
                printf( "Failed to close Request handle\n" );
        }
        if(!InternetCloseHandle(hConnect))
            printf("Failed to close Connect handle\n");
    }
    if( InternetCloseHandle( hSession ) == FALSE )
        printf( "Failed to close Session handle\n" );

    printf( "\nFinished.\n" );
}



BOOL UseHttpSendReqEx(HINTERNET hRequest, DWORD dwPostSize)
{
    INTERNET_BUFFERS BufferIn;
    DWORD dwBytesWritten;
    int n;
    BYTE pBuffer[1024];
    BOOL bRet;

    BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); // Must be set or error will occur
    BufferIn.Next = NULL;
    BufferIn.lpcszHeader = NULL;
    BufferIn.dwHeadersLength = 0;
    BufferIn.dwHeadersTotal = 0;
    BufferIn.lpvBuffer = NULL;                
    BufferIn.dwBufferLength = 0;
    BufferIn.dwBufferTotal = dwPostSize; // This is the only member used other than dwStructSize
    BufferIn.dwOffsetLow = 0;
    BufferIn.dwOffsetHigh = 0;

    if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, 0, 0))
    {
        printf( "Error on HttpSendRequestEx %d\n",GetLastError() );
        return FALSE;
    }

    FillMemory(pBuffer, 1024, 'D'); // Fill buffer with data

    bRet=TRUE;
    for(n=1; n<=(int)dwPostSize/1024 && bRet; n++)
    {
        if(bRet=InternetWriteFile( hRequest, pBuffer, 1024, &dwBytesWritten))
            printf( "\r%d bytes sent.", n*1024);
    }
       
    if(!bRet)
    {
        printf( "\nError on InternetWriteFile %lu\n",GetLastError() );
        return FALSE;
    }

    if(!HttpEndRequest(hRequest, NULL, 0, 0))
    {
        printf( "Error on HttpEndRequest %lu \n", GetLastError());
        return FALSE;
    }

    return TRUE;
}

0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Errors will happen. It is a fact of life for the programmer. How and when errors are detected have a great impact on quality and cost of a product. It is better to detect errors at compile time, when possible and practical. Errors that make their wa…
  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

837 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question