Solved

consuming a .net web service with C++ 6.0

Posted on 2004-08-12
5
502 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

Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

Join & Write a Comment

When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

706 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

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now